diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..40faeef
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,28 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// 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.
+
+filegroup {
+    name: "smali_script",
+    srcs: ["scripts/smali"],
+}
+
+filegroup {
+    name: "baksmali_script",
+    srcs: ["scripts/baksmali"],
+}
+
+filegroup {
+    name: "smali_build.gradle",
+    srcs: ["build.gradle"],
+}
diff --git a/MODULE_LICENSE_BSD b/MODULE_LICENSE_BSD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_BSD
diff --git a/README.version b/README.version
new file mode 100644
index 0000000..22387f0
--- /dev/null
+++ b/README.version
@@ -0,0 +1,3 @@
+URL: https://bitbucket.org/JesusFreke/smali/downloads/smali-2.2.0.jar
+Version: 2.2.0
+BugComponent: 99143
diff --git a/baksmali/Android.bp b/baksmali/Android.bp
new file mode 100644
index 0000000..7f95539
--- /dev/null
+++ b/baksmali/Android.bp
@@ -0,0 +1,44 @@
+// Copyright (C) 2010 The Android Open Source Project
+//
+// 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.
+
+//create a new baksmali.properties file using the correct version
+genrule {
+    name: "baksmali_version",
+    srcs: [":smali_build.gradle"],
+    out: ["baksmali.properties"],
+    cmd: "echo \"application.version=$$(grep -o -e \"^version = '\\(.*\\)'\" $(in) | grep -o -e \"[0-9.]\\+\")-aosp\" > $(out)",
+}
+
+// build baksmali jar
+// ============================================================
+
+java_binary_host {
+    name: "baksmali",
+
+    srcs: [
+        "src/main/java/**/*.java",
+    ],
+
+    manifest: "manifest.txt",
+
+    static_libs: [
+        "dexlib2",
+        "smali-util",
+        "jcommander",
+    ],
+
+    java_resources: [":baksmali_version"],
+
+    wrapper: ":baksmali_script",
+}
diff --git a/baksmali/manifest.txt b/baksmali/manifest.txt
new file mode 100644
index 0000000..f769c2d
--- /dev/null
+++ b/baksmali/manifest.txt
@@ -0,0 +1 @@
+Main-Class: org.jf.baksmali.Main
diff --git a/deodexerant/Android.bp b/deodexerant/Android.bp
new file mode 100644
index 0000000..48d6fe2
--- /dev/null
+++ b/deodexerant/Android.bp
@@ -0,0 +1,44 @@
+// Copyright 2011, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * 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.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// 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
+// OWNER 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.
+
+cc_binary {
+    name: "deodexerant",
+
+    srcs: ["deodexerant.c"],
+
+    cflags: [
+        "-Wall",
+        "-Werror",
+        "-Wno-incompatible-pointer-types-discards-qualifiers",
+        "-Wno-main-return-type",
+        "-Wno-unused-parameter",
+    ],
+
+    ldflags: ["-Wl,--hash-style=sysv"],
+}
diff --git a/deodexerant/Android.mk b/deodexerant/Android.mk
deleted file mode 100644
index 46a9dba..0000000
--- a/deodexerant/Android.mk
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2011, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#    * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#    * 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.
-#    * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# 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
-# OWNER 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := deodexerant
-
-LOCAL_SRC_FILES:= deodexerant.c
-
-LOCAL_SHARED_LIBRARIES := libdl
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_LDFLAGS := -Wl,--hash-style=sysv
-
-include $(BUILD_EXECUTABLE)
diff --git a/dexlib2/Android.bp b/dexlib2/Android.bp
new file mode 100644
index 0000000..e9fab20
--- /dev/null
+++ b/dexlib2/Android.bp
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// 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.
+
+// build dexlib2 jar
+// ============================================================
+
+java_library_host {
+    name: "dexlib2",
+
+    srcs: [
+        "src/main/java/**/*.java",
+    ],
+
+    static_libs: [
+        "commons-cli-1.2",
+        "guava",
+        "jcommander",
+        "jsr305",
+        "smali-util",
+    ],
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
index d6d4fdb..5f8106d 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
@@ -77,11 +77,11 @@
 
 
         if (api >= 21) {
-            this.api = api;
+        this.api = api;
             this.artVersion = mapApiToArtVersion(api);
         } else if (artVersion >= 0 && artVersion < 39) {
             this.api = mapArtVersionToApi(artVersion);
-            this.artVersion = artVersion;
+        this.artVersion = artVersion;
         } else {
             this.api = api;
             this.artVersion = artVersion;
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
index cc8a53c..44cc5e2 100755
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
@@ -289,7 +289,7 @@
     @Nonnull
     protected Iterable<ClassDef> getDirectInterfaces() {
         Iterable<ClassDef> directInterfaces =
-                FluentIterable.from(getInterfaces().values()).filter(Predicates.notNull());
+                Iterables.filter(getInterfaces().values(), Predicates.notNull());
 
         if (!interfacesFullyResolved) {
             throw new UnresolvedClassException("Interfaces for class %s not fully resolved: %s", getType(),
@@ -529,8 +529,8 @@
                     ClassProto superclass = null;
                     if (superclassType != null) {
                         superclass = (ClassProto) classPath.getClass(superclassType);
-                        startFieldOffset = superclass.getNextFieldOffset();
-                    }
+                            startFieldOffset = superclass.getNextFieldOffset();
+                        }
 
                     int fieldIndexMod;
                     if ((startFieldOffset % 8) == 0) {
@@ -617,12 +617,12 @@
 
                         //add padding to align the wide fields, if needed
                         if (fieldTypes[i] == WIDE && !gotDouble) {
-                            if (fieldOffset % 8 != 0) {
-                                assert fieldOffset % 8 == 4;
-                                fieldOffset += 4;
+                                if (fieldOffset % 8 != 0) {
+                                    assert fieldOffset % 8 == 4;
+                                    fieldOffset += 4;
+                                }
+                                gotDouble = true;
                             }
-                            gotDouble = true;
-                        }
 
                         instanceFields.append(fieldOffset, field);
                         if (fieldTypes[i] == WIDE) {
@@ -979,14 +979,14 @@
                         for (int j=0; j<vtable.size(); j++) {
                             Method candidate = vtable.get(j);
                             if (MethodUtil.methodSignaturesMatch(candidate, interfaceMethod)) {
-                                if (!classPath.shouldCheckPackagePrivateAccess() ||
+                        if (!classPath.shouldCheckPackagePrivateAccess() ||
                                         AnalyzedMethodUtil.canAccess(ClassProto.this, candidate, true, false, false)) {
                                     if (interfaceMethodOverrides(interfaceMethod, candidate)) {
                                         vtable.set(j, interfaceMethod);
-                                    }
-                                }
                             }
                         }
+                    }
+                }
 
                         if (vtableIndex >= 0) {
                             if (!isOverridableByDefaultMethod(vtable.get(vtableIndex))) {
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
index a88f509..e8db969 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
@@ -43,7 +43,7 @@
     public static final int ITEM_SIZE = 0x70;
 
     private static final byte[] MAGIC_VALUE = new byte[] { 0x64, 0x65, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00 };
-    private static final int[] SUPPORTED_DEX_VERSIONS = new int[] { 35, 37 };
+    private static final int[] SUPPORTED_DEX_VERSIONS = new int[] { 35, 37, 38 };
 
     public static final int LITTLE_ENDIAN_TAG = 0x12345678;
     public static final int BIG_ENDIAN_TAG = 0x78563412;
@@ -232,9 +232,12 @@
         if (api < 24) {
             // Prior to Android N we only support dex version 035.
             return getMagicForDexVersion(35);
-        } else {
+        } else if (api < 26) {
             // On android N and later we support dex version 037.
             return getMagicForDexVersion(37);
+        } else {
+            // On android O and later we support dex version 038.
+            return getMagicForDexVersion(38);
         }
     }
 
@@ -269,8 +272,8 @@
         for (int i=0; i<4; i++) {
             if (buf[offset + i] != MAGIC_VALUE[i]) {
                 return false;
+                }
             }
-        }
         for (int i=4; i<7; i++) {
             if (buf[offset + i] < '0' ||
                     buf[offset + i] > '9') {
@@ -279,7 +282,7 @@
         }
         if (buf[offset + 7] != MAGIC_VALUE[7]) {
             return false;
-        }
+    }
 
         return true;
     }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java
index 4f67a87..232b482 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java
@@ -160,9 +160,8 @@
         if (lastIndex > -1) {
             return new AbstractCollection<BuilderEncodedValue>() {
                 @Nonnull @Override public Iterator<BuilderEncodedValue> iterator() {
-                    return FluentIterable.from(sortedStaticFields)
-                            .limit(lastIndex+1)
-                            .transform(GET_INITIAL_VALUE).iterator();
+                    Iterable<BuilderField> fields = Iterables.limit(sortedStaticFields, lastIndex + 1);
+                    return Iterables.transform(fields, GET_INITIAL_VALUE).iterator();
                 }
 
                 @Override public int size() {
@@ -256,8 +255,7 @@
         if (hasParameterAnnotations) {
             return new AbstractForwardSequentialList<BuilderAnnotationSet>() {
                 @Nonnull @Override public Iterator<BuilderAnnotationSet> iterator() {
-                    return FluentIterable.from(parameters)
-                            .transform(PARAMETER_ANNOTATIONS).iterator();
+                    return Iterables.transform(parameters, PARAMETER_ANNOTATIONS).iterator();
                 }
 
                 @Override public int size() {
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java
index bb23b14..7c1d681 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java
@@ -267,9 +267,8 @@
         if (lastIndex > -1) {
             return new AbstractCollection<EncodedValue>() {
                 @Nonnull @Override public Iterator<EncodedValue> iterator() {
-                    return FluentIterable.from(sortedStaticFields)
-                            .limit(lastIndex+1)
-                            .transform(GET_INITIAL_VALUE).iterator();
+                    Iterable<Field> fields = Iterables.limit(sortedStaticFields, lastIndex + 1);
+                    return Iterables.transform(fields, GET_INITIAL_VALUE).iterator();
                 }
 
                 @Override public int size() {
@@ -359,8 +358,7 @@
         if (hasParameterAnnotations) {
             return new AbstractForwardSequentialList<Set<? extends Annotation>>() {
                 @Nonnull @Override public Iterator<Set<? extends Annotation>> iterator() {
-                    return FluentIterable.from(parameters)
-                            .transform(PARAMETER_ANNOTATIONS).iterator();
+                    return Iterables.transform(parameters, PARAMETER_ANNOTATIONS).iterator();
                 }
 
                 @Override public int size() {
diff --git a/extract-property.xslt b/extract-property.xslt
new file mode 100644
index 0000000..51b0668
--- /dev/null
+++ b/extract-property.xslt
@@ -0,0 +1,4 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pom="http://maven.apache.org/POM/4.0.0" version="1.0">
+  <xsl:output method="text"/>
+  <xsl:template match="/"><xsl:value-of select="//pom:aversion"/></xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/scripts/baksmali b/scripts/baksmali
index bd3f820..f2bfe75 100755
--- a/scripts/baksmali
+++ b/scripts/baksmali
@@ -14,24 +14,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# As per the Apache license requirements, this file has been modified
-# from its original state.
-#
-# Such modifications are Copyright (C) 2010 Ben Gruver, and are released
-# under the original license
-
-# This script is a wrapper around baksmali.jar, so you can simply call
-# "baksmali", instead of java -jar baksmali.jar. It is heavily based on
-# the "dx" script from the Android SDK
-
 # Set up prog to be the path of this script, including following symlinks,
 # and set up progdir to be the fully-qualified pathname of its directory.
 prog="$0"
 while [ -h "${prog}" ]; do
     newProg=`/bin/ls -ld "${prog}"`
-    echo ${newProg}
-
-
     newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
     if expr "x${newProg}" : 'x/' >/dev/null; then
         prog="${newProg}"
@@ -50,34 +37,49 @@
 
 jarfile=baksmali.jar
 libdir="$progdir"
-if [ ! -r "$libdir/$jarfile" ]
-then
+
+if [ ! -r "$libdir/$jarfile" ]; then
+    # set dx.jar location for the Android tree case
+    libdir=`dirname "$progdir"`/framework
+fi
+
+if [ ! -r "$libdir/$jarfile" ]; then
     echo `basename "$prog"`": can't find $jarfile"
     exit 1
 fi
 
+
+# By default, give baksmali a max heap size of 256 mb. This can be overridden
+# by using a "-J" option (see below).
+defaultMx="-Xmx256M"
+
+# The following will extract any initial parameters of the form
+# "-J<stuff>" from the command line and pass them to the Java
+# invocation (instead of to dx). This makes it possible for you to add
+# a command-line parameter such as "-JXmx256M" in your scripts, for
+# example. "java" (with no args) and "java -X" give a summary of
+# available options.
+
 javaOpts=""
 
-# If you want DX to have more memory when executing, uncomment the following
-# line and adjust the value accordingly. Use "java -X" for a list of options
-# you can pass here.
-#
-javaOpts="-Xmx256M"
-
-# Alternatively, this will extract any parameter "-Jxxx" from the command line
-# and pass them to Java (instead of to dx). This makes it possible for you to
-# add a command-line parameter such as "-JXmx256M" in your ant scripts, for
-# example.
 while expr "x$1" : 'x-J' >/dev/null; do
-    opt=`expr "$1" : '-J\(.*\)'`
+    opt=`expr "x$1" : 'x-J\(.*\)'`
     javaOpts="${javaOpts} -${opt}"
+    if expr "x${opt}" : "xXmx[0-9]" >/dev/null; then
+        defaultMx="no"
+    fi
     shift
 done
 
-if [ "$OSTYPE" = "cygwin" ] ; then
-	jarpath=`cygpath -w  "$libdir/$jarfile"`
+if [ "${defaultMx}" != "no" ]; then
+    javaOpts="${javaOpts} ${defaultMx}"
+fi
+
+if [ "$OSTYPE" = "cygwin" ]; then
+    # For Cygwin, convert the jarfile path into native Windows style.
+    jarpath=`cygpath -w "$libdir/$jarfile"`
 else
-	jarpath="$libdir/$jarfile"
+    jarpath="$libdir/$jarfile"
 fi
 
 exec java $javaOpts -jar "$jarpath" "$@"
diff --git a/scripts/smali b/scripts/smali
index 9ede675..71f8e2b 100755
--- a/scripts/smali
+++ b/scripts/smali
@@ -14,24 +14,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# As per the Apache license requirements, this file has been modified
-# from its original state.
-#
-# Such modifications are Copyright (C) 2010 Ben Gruver, and are released
-# under the original license
-
-# This script is a wrapper for smali.jar, so you can simply call "smali",
-# instead of java -jar smali.jar. It is heavily based on the "dx" script
-# from the Android SDK
-
 # Set up prog to be the path of this script, including following symlinks,
 # and set up progdir to be the fully-qualified pathname of its directory.
 prog="$0"
 while [ -h "${prog}" ]; do
     newProg=`/bin/ls -ld "${prog}"`
-    echo ${newProg}
-
-
     newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
     if expr "x${newProg}" : 'x/' >/dev/null; then
         prog="${newProg}"
@@ -50,32 +37,47 @@
 
 jarfile=smali.jar
 libdir="$progdir"
-if [ ! -r "$libdir/$jarfile" ]
-then
+
+if [ ! -r "$libdir/$jarfile" ]; then
+    # set dx.jar location for the Android tree case
+    libdir=`dirname "$progdir"`/framework
+fi
+
+if [ ! -r "$libdir/$jarfile" ]; then
     echo `basename "$prog"`": can't find $jarfile"
     exit 1
 fi
 
+
+# By default, give smali a max heap size of 256 mb. This can be overridden
+# by using a "-J" option (see below).
+defaultMx="-Xmx256M"
+
+# The following will extract any initial parameters of the form
+# "-J<stuff>" from the command line and pass them to the Java
+# invocation (instead of to dx). This makes it possible for you to add
+# a command-line parameter such as "-JXmx256M" in your scripts, for
+# example. "java" (with no args) and "java -X" give a summary of
+# available options.
+
 javaOpts=""
 
-# If you want DX to have more memory when executing, uncomment the following
-# line and adjust the value accordingly. Use "java -X" for a list of options
-# you can pass here.
-#
-javaOpts="-Xmx512M"
-
-# Alternatively, this will extract any parameter "-Jxxx" from the command line
-# and pass them to Java (instead of to dx). This makes it possible for you to
-# add a command-line parameter such as "-JXmx256M" in your ant scripts, for
-# example.
 while expr "x$1" : 'x-J' >/dev/null; do
-    opt=`expr "$1" : '-J\(.*\)'`
+    opt=`expr "x$1" : 'x-J\(.*\)'`
     javaOpts="${javaOpts} -${opt}"
+    if expr "x${opt}" : "xXmx[0-9]" >/dev/null; then
+        defaultMx="no"
+    fi
     shift
 done
 
-if [ "$OSTYPE" = "cygwin" ] ; then
-    jarpath=`cygpath -w  "$libdir/$jarfile"`
+if [ "${defaultMx}" != "no" ]; then
+    javaOpts="${javaOpts} ${defaultMx}"
+fi
+
+if [ "$OSTYPE" = "cygwin" ]; then
+    # For Cygwin, convert the jarfile path into native Windows style.
+    jarpath=`cygpath -w "$libdir/$jarfile"`
 else
     jarpath="$libdir/$jarfile"
 fi
diff --git a/smali/Android.bp b/smali/Android.bp
new file mode 100644
index 0000000..4bbfa1b
--- /dev/null
+++ b/smali/Android.bp
@@ -0,0 +1,44 @@
+// Copyright (C) 2010 The Android Open Source Project
+//
+// 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.
+
+genrule {
+    name: "smali_version",
+    srcs: [":smali_build.gradle"],
+    out: ["smali.properties"],
+    cmd: "echo \"application.version=$$(grep -o -e \"^version = '\\(.*\\)'\" $(in) | grep -o -e \"[0-9.]\\+\")-aosp\" > $(out)",
+}
+
+// build smali jar
+// ============================================================
+
+java_binary_host {
+    name: "smali",
+
+    srcs: [
+        "src/main/java/**/*.java",
+    ],
+
+    manifest: "manifest.txt",
+
+    static_libs: [
+        "antlr-runtime",
+        "dexlib2",
+        "jcommander",
+        "smali-util",
+    ],
+
+    java_resources: [":smali_version"],
+
+    wrapper: ":smali_script",
+}
diff --git a/smali/manifest.txt b/smali/manifest.txt
new file mode 100644
index 0000000..0a58e57
--- /dev/null
+++ b/smali/manifest.txt
@@ -0,0 +1 @@
+Main-Class: org.jf.smali.Main
diff --git a/smali/runantlr.sh b/smali/runantlr.sh
new file mode 100755
index 0000000..1133f41
--- /dev/null
+++ b/smali/runantlr.sh
@@ -0,0 +1,111 @@
+#!/bin/bash
+#
+# This script runs antlr3 generating java code based on .g (ANLTR3) files.
+# antlr3 tool itself can be downloaded by running the gradle build.
+#
+# The script can be run from anywhere (it does not depend on current working directory)
+# Set $ANTLR to overwrite antlr location, if desired
+#
+# After making any changes to the lexer, the update source file(s) generated by
+# this script should be checked in to the repository
+
+# Update when switching to a different version of antlr
+EXPECTED_ANTLR_VERSION_STR="ANTLR Parser Generator  Version 3.5.2"
+
+# Get the location of this script used to find locations of other things in the tree.
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+# Point to the directory which contains the ANTLR jars.
+if [[ -z  "$ANTLR" ]]
+then
+  # Best effort to find it inside of the gradle cache
+  ANTLR="$(find $HOME/.gradle/caches/artifacts-* -name 'org.antlr' | head -n 1)"
+fi
+
+# Class that contains the static main function.
+ANTLR_MAIN="org.antlr.Tool"
+
+if ! [[ -d "$ANTLR" ]]; then
+  echo >&2 "ERROR: Could not find ANTLR jars directory"
+  exit 1
+fi
+
+# Build up the classpath by finding all the JARs
+ANTLR_JARS=""
+
+for jar_file_name in $(find "$ANTLR" -name '*.jar'); do
+  if ! [[ -z "$ANTLR_JARS" ]]; then
+    ANTLR_JARS+=":"
+  fi
+  ANTLR_JARS+="$jar_file_name"
+done
+
+if [[ -z "$ANTLR_JARS" ]]; then
+  echo >&2 "Could not find any JARs in the ANTLR directory"
+  echo >&2 "Is '"$ANTLR"' the correct path to the JARs?"
+  exit 1
+fi
+
+function run_antlr() {
+  CLASSPATH="$ANTLR_JARS" java 2>&1 "$ANTLR_MAIN" "$@"
+}
+
+ANTLR_VERSION="$(run_antlr -version)"
+
+if [[ -z "$ANTLR_VERSION" ]]
+then
+  echo >&2 "ERROR: Failed to execute antlr at \"$ANTLR\""
+  exit 1
+fi
+
+if [[ "$EXPECTED_ANTLR_VERSION_STR" != "$ANTLR_VERSION" ]]
+then
+  echo >&2 "ERROR: Wrong version of jflex: \"$ANTLR_VERSION\". Expected: \"$EXPECTED_ANTLR_VERSION_STR\""
+  exit 1
+fi
+
+
+function generate_file {
+  local JAVA_FILE="$1"
+  local G_FILE="$2"
+
+  if ! [[ -f "$JAVA_FILE" ]]; then
+    echo >&2 "ERROR: File \"$JAVA_FILE\" not found"
+    exit 1
+  fi
+
+  echo "Re-generating \"$JAVA_FILE\"..."
+
+  [[ -f "$JAVA_FILE" ]] && rm -f "$JAVA_FILE"
+
+  local JAVA_DIR="$(dirname "$JAVA_FILE")"
+  # Generate the java file from the antlr file
+  run_antlr -verbose -fo "$JAVA_DIR" "$G_FILE"
+
+  # delete trailing space from end of each line to make gerrit happy
+  sed 's/[ ]*$//' "$JAVA_FILE" > "$JAVA_FILE.tmp"
+  [[ -f "$JAVA_FILE" ]] && rm "$JAVA_FILE"
+  mv "$JAVA_FILE.tmp" "$JAVA_FILE"
+
+  echo "DONE"
+  echo ""
+  echo ""
+}
+
+function cleanup_tokens {
+  local JAVA_FILE="$1"
+
+  # delete the tokens file, they are not necessary to actually build from Android.mk
+  local TOKEN_FILE="${JAVA_FILE%%\.java}.tokens"
+  [[ -f "$TOKEN_FILE" ]] && rm "$TOKEN_FILE"
+}
+
+generate_file "$SCRIPT_DIR/src/main/java/org/jf/smali/smaliParser.java" "$SCRIPT_DIR/src/main/antlr/smaliParser.g"
+generate_file "$SCRIPT_DIR/src/main/java/org/jf/smali/smaliTreeWalker.java" "$SCRIPT_DIR/src/main/antlr/smaliTreeWalker.g"
+
+# Clean up the tokens, no longer necessary once the tree walker is generated
+cleanup_tokens "$SCRIPT_DIR/src/main/java/org/jf/smali/smaliParser.java"
+cleanup_tokens "$SCRIPT_DIR/src/main/java/org/jf/smali/smaliTreeWalker.java"
+
+# Uncomment to run interactively
+#run_antlr "$@"
diff --git a/smali/runjflex.sh b/smali/runjflex.sh
new file mode 100755
index 0000000..783b912
--- /dev/null
+++ b/smali/runjflex.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+#
+# This script runs jflex generating java code based on .jflex files.
+# jflex tool itself resides in external/jflex. At the time of this writing
+# it's not a part of jflex manifest and needs to be checked out manually.
+#
+# The script can be run from anywhere (it does not depend on current working directory)
+# Set $JFLEX to overwrite jflex location, if desired
+#
+# After making any changes to the lexer, the update source file(s) generated by
+# this script should be checked in to the repository
+
+# Update when switching to a different version of jflex
+EXPECTED_JFLEX_VERSION="1.6.1"
+EXPECTED_JFLEX_VERSION_STR="This is JFlex $EXPECTED_JFLEX_VERSION"
+
+# Get the location of this script used to find locations of other things in the tree.
+SCRIPT_DIR=`dirname $0`
+echo $SCRIPT_DIR
+
+TOP_PATH="$SCRIPT_DIR/../../.."
+
+# Run the java jar when 'JFLEX' is not in the environment
+function exec_jar_jflex {
+  java -jar "$jflex_location" "$@"
+}
+
+# All specifying jflex but fallback to default location
+if [ -z  "$JFLEX" ]
+then
+  # Best effort to find it inside of the gradle cache
+  jflex_jar_name="jflex-${EXPECTED_JFLEX_VERSION}.jar"
+  jflex_location="$(find $HOME/.gradle/caches/artifacts-* -name "$jflex_jar_name" | head -n 1)"
+  if [ -z $jflex_location ]; then
+    echo "ERROR: Could not find jflex location, consider setting the \$JFLEX variable to point to it"
+    exit 1
+  fi
+  JFLEX=exec_jar_jflex
+fi
+
+JFLEX_VERSION=`"$JFLEX" --version`
+
+if [ "$JFLEX_VERSION" = "" ]
+then
+  echo "ERROR: Failed to execute jflex at \"$JFLEX\""
+  exit 1
+fi
+
+if [ "$EXPECTED_JFLEX_VERSION_STR" != "$JFLEX_VERSION" ]
+then
+  echo "ERROR: Wrong version of jflex: \"$JFLEX_VERSION\". Expected: \"$EXPECTED_JFLEX_VERSION_STR\""
+  exit 1
+fi
+
+JAVA_FILE=$SCRIPT_DIR/src/main/java/org/jf/smali/smaliFlexLexer.java
+rm -f "$JAVA_FILE"
+
+"$JFLEX" --nobak -d "$SCRIPT_DIR/src/main/java/org/jf/smali" "$SCRIPT_DIR/src/main/jflex/smaliLexer.jflex"
+
+# delete trailing space from end of each line to make gerrit happy
+sed 's/[ ]*$//' "$JAVA_FILE" > "$JAVA_FILE.tmp"
+rm "$JAVA_FILE"
+mv "$JAVA_FILE.tmp" "$JAVA_FILE"
diff --git a/smali/src/main/java/org/jf/smali/smaliFlexLexer.java b/smali/src/main/java/org/jf/smali/smaliFlexLexer.java
new file mode 100644
index 0000000..4092111
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/smaliFlexLexer.java
@@ -0,0 +1,4100 @@
+/* The following code was generated by JFlex 1.6.1 */
+
+package org.jf.smali;
+
+import java.io.*;
+import org.antlr.runtime.*;
+import org.jf.util.*;
+import static org.jf.smali.smaliParser.*;
+
+
+/**
+ * This class is a scanner generated by
+ * <a href="http://www.jflex.de/">JFlex</a> 1.6.1
+ * from the specification file <tt>./src/main/jflex/smaliLexer.jflex</tt>
+ */
+public class smaliFlexLexer implements TokenSource, LexerErrorInterface {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** initial size of the lookahead buffer */
+  private static final int ZZ_BUFFERSIZE = 16384;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+  public static final int PARAM_LIST_OR_ID = 2;
+  public static final int PARAM_LIST = 4;
+  public static final int ARRAY_DESCRIPTOR = 6;
+  public static final int STRING = 8;
+  public static final int CHAR = 10;
+
+  /**
+   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
+   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
+   *                  at the beginning of a line
+   * l is of the form l = 2*k, k a non negative integer
+   */
+  private static final int ZZ_LEXSTATE[] = {
+     0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5, 5
+  };
+
+  /**
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED =
+    "\11\0\1\115\1\64\2\0\1\64\22\0\1\50\1\0\1\62\1\72"+
+    "\1\22\2\0\1\63\1\113\1\114\2\0\1\110\1\7\1\17\1\30"+
+    "\1\1\1\76\1\75\1\102\1\73\1\5\1\77\1\5\1\101\1\4"+
+    "\1\107\1\31\1\104\1\106\1\105\1\0\1\70\1\16\2\23\1\61"+
+    "\1\6\1\25\2\57\1\24\1\26\1\57\1\27\1\57\1\12\1\57"+
+    "\1\10\2\57\1\60\1\14\1\57\1\103\1\57\1\2\1\15\1\26"+
+    "\1\32\1\65\2\56\1\57\1\56\1\35\1\3\1\33\1\47\1\41"+
+    "\1\13\1\52\1\51\1\11\1\74\1\54\1\34\1\43\1\44\1\46"+
+    "\1\40\1\100\1\42\1\36\1\45\1\37\1\66\1\55\1\71\1\53"+
+    "\1\67\1\111\1\0\1\112\43\0\u1f5f\22\20\0\30\22\10\0\ub7d0\22"+
+    "\u0400\20\u0400\21\u1ff0\22\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\40\0";
+
+  /**
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /**
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\6\0\1\1\1\2\2\3\1\2\4\3\1\4\1\1"+
+    "\2\5\1\3\1\6\15\3\1\7\1\3\1\10\1\11"+
+    "\2\3\1\12\1\13\1\1\1\14\1\15\1\16\1\17"+
+    "\1\20\1\21\1\22\1\23\1\24\1\5\1\23\1\25"+
+    "\1\26\1\23\1\27\1\30\1\31\1\0\1\27\1\32"+
+    "\1\33\1\0\1\2\3\3\1\34\1\35\1\36\1\0"+
+    "\1\37\1\40\1\41\2\3\2\42\1\3\1\0\1\43"+
+    "\12\3\3\4\1\44\10\4\1\45\1\3\1\0\1\3"+
+    "\2\0\22\3\1\46\31\3\6\0\1\47\1\50\1\51"+
+    "\1\52\1\53\1\54\1\55\1\56\1\57\1\60\1\61"+
+    "\1\2\1\0\1\41\1\3\1\0\1\62\1\36\2\3"+
+    "\1\42\12\3\1\41\5\3\21\4\1\3\1\0\1\63"+
+    "\2\0\1\64\2\0\43\3\1\65\14\3\1\66\1\0"+
+    "\1\64\1\0\1\67\1\52\1\61\1\0\1\36\1\0"+
+    "\2\3\1\42\5\3\1\70\5\3\1\70\4\3\25\4"+
+    "\4\0\7\3\1\71\5\3\1\72\11\3\1\73\5\3"+
+    "\1\74\1\3\1\75\6\3\1\76\6\3\1\77\3\3"+
+    "\1\52\1\61\1\100\2\3\1\101\14\3\4\4\1\102"+
+    "\13\4\1\103\1\0\3\4\3\3\1\104\32\3\1\0"+
+    "\11\3\1\105\5\3\1\0\3\3\1\52\1\61\1\3"+
+    "\1\106\22\3\1\0\1\3\1\4\1\107\1\110\1\111"+
+    "\1\112\3\4\1\113\3\4\1\114\13\4\5\3\1\0"+
+    "\34\3\1\105\5\3\2\0\12\3\1\71\4\3\2\0"+
+    "\3\3\2\115\12\3\1\0\13\3\1\0\1\3\2\4"+
+    "\1\116\4\4\1\117\15\4\1\120\7\3\1\0\1\121"+
+    "\1\0\16\3\1\71\11\3\1\71\12\3\1\0\1\122"+
+    "\1\74\11\3\1\0\3\3\1\123\1\124\1\0\1\61"+
+    "\11\3\1\0\21\3\1\0\1\3\24\4\1\3\1\71"+
+    "\5\3\1\0\1\125\13\3\1\0\10\3\1\0\3\3"+
+    "\1\126\10\3\1\0\4\3\1\127\1\3\2\0\3\3"+
+    "\1\0\4\3\1\70\2\3\1\70\2\3\1\0\15\3"+
+    "\1\70\3\3\1\130\1\3\1\4\1\131\5\4\1\132"+
+    "\1\133\11\4\1\0\1\4\6\3\1\0\11\3\1\72"+
+    "\2\3\1\72\1\3\1\0\2\3\1\0\7\3\1\74"+
+    "\1\0\2\3\1\134\4\3\2\0\2\3\1\0\10\3"+
+    "\1\135\1\136\16\3\6\4\1\137\1\140\5\4\1\141"+
+    "\2\4\1\142\3\3\1\143\1\0\1\3\1\144\7\3"+
+    "\1\0\11\3\1\0\5\3\2\0\2\3\1\145\20\3"+
+    "\1\146\1\147\1\150\10\4\1\151\1\4\2\3\2\0"+
+    "\5\3\1\0\2\3\1\105\1\65\3\3\1\105\1\152"+
+    "\5\3\1\0\1\153\1\0\7\3\1\154\7\3\11\4"+
+    "\1\155\2\0\1\156\13\3\1\157\1\160\2\3\1\161"+
+    "\2\3\1\0\1\154\2\3\1\154\3\3\11\4\2\0"+
+    "\1\162\1\163\1\164\10\3\1\0\5\3\1\165\1\166"+
+    "\1\167\5\4\1\170\2\0\1\171\6\3\1\0\4\3"+
+    "\1\172\1\173\3\4\3\0\5\3\1\0\3\3\1\174"+
+    "\3\4\3\0\4\3\1\0\3\3\1\0\3\4\1\0"+
+    "\1\175\1\0\2\3\1\176\1\177\1\200\2\3\1\0"+
+    "\1\201\1\202\1\203\1\204\1\0\2\3\3\0\1\205"+
+    "\2\0\1\206\1\3\4\0\1\207\1\3\4\0\1\3"+
+    "\3\0\1\210\1\3\3\0\1\3\1\211\1\212\1\213"+
+    "\1\214";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[1209];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /**
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+    "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u0444\0\u0492"+
+    "\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4\0\u0702"+
+    "\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u08d6\0\u0924\0\u0972"+
+    "\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa\0\u01d4\0\u01d4\0\u0af8\0\u0b46"+
+    "\0\u0b94\0\u0270\0\u0be2\0\u01d4\0\u01d4\0\u01d4\0\u01d4\0\u01d4"+
+    "\0\u01d4\0\u01d4\0\u01d4\0\u01d4\0\u01d4\0\u0c30\0\u0c7e\0\u01d4"+
+    "\0\u0ccc\0\u0d1a\0\u01d4\0\u01d4\0\u0d68\0\u0db6\0\u01d4\0\u01d4"+
+    "\0\u0e04\0\u0e52\0\u0ea0\0\u0eee\0\u0f3c\0\u0270\0\u0270\0\u0f8a"+
+    "\0\u04e0\0\u0270\0\u0270\0\u0270\0\u0fd8\0\u1026\0\u1074\0\u10c2"+
+    "\0\u1110\0\u115e\0\u01d4\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u12e4"+
+    "\0\u1332\0\u1380\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u1506\0\u1554"+
+    "\0\u01d4\0\u15a2\0\u15f0\0\u163e\0\u168c\0\u16da\0\u1728\0\u1776"+
+    "\0\u17c4\0\u052e\0\u1812\0\u1860\0\u18ae\0\u18fc\0\u194a\0\u1998"+
+    "\0\u19e6\0\u1a34\0\u1a82\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08"+
+    "\0\u1c56\0\u1ca4\0\u1cf2\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78"+
+    "\0\u1ec6\0\u1f14\0\u1f62\0\u1fb0\0\u1ffe\0\u204c\0\u209a\0\u20e8"+
+    "\0\u2136\0\u2184\0\u21d2\0\u2220\0\u226e\0\u22bc\0\u230a\0\u2358"+
+    "\0\u23a6\0\u23f4\0\u2442\0\u2490\0\u24de\0\u252c\0\u257a\0\u25c8"+
+    "\0\u2616\0\u2664\0\u26b2\0\u2700\0\u274e\0\u279c\0\u27ea\0\u2838"+
+    "\0\u2886\0\u01d4\0\u01d4\0\u01d4\0\u28d4\0\u01d4\0\u01d4\0\u01d4"+
+    "\0\u01d4\0\u01d4\0\u01d4\0\u2922\0\u2970\0\u29be\0\u2a0c\0\u2a5a"+
+    "\0\u2aa8\0\u01d4\0\u01d4\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e"+
+    "\0\u2c7c\0\u2cca\0\u2d18\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e"+
+    "\0\u2eec\0\u2f3a\0\u2f88\0\u2fd6\0\u3024\0\u3072\0\u30c0\0\u310e"+
+    "\0\u315c\0\u31aa\0\u31f8\0\u3246\0\u3294\0\u32e2\0\u3330\0\u337e"+
+    "\0\u33cc\0\u341a\0\u3468\0\u34b6\0\u3504\0\u3552\0\u35a0\0\u35ee"+
+    "\0\u363c\0\u1860\0\u368a\0\u36d8\0\u1860\0\u3726\0\u3774\0\u37c2"+
+    "\0\u3810\0\u385e\0\u38ac\0\u38fa\0\u3948\0\u3996\0\u39e4\0\u3a32"+
+    "\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06\0\u3c54\0\u3ca2"+
+    "\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u3e76\0\u3ec4\0\u3f12"+
+    "\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6\0\u4134\0\u4182"+
+    "\0\u41d0\0\u421e\0\u0270\0\u426c\0\u42ba\0\u4308\0\u4356\0\u43a4"+
+    "\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6\0\u01d4"+
+    "\0\u0c30\0\u01d4\0\u0ccc\0\u01d4\0\u4614\0\u4662\0\u46b0\0\u46fe"+
+    "\0\u474c\0\u479a\0\u47e8\0\u4836\0\u4884\0\u48d2\0\u4920\0\u496e"+
+    "\0\u49bc\0\u4a0a\0\u4a58\0\u4aa6\0\u4af4\0\u4b42\0\u4b90\0\u4bde"+
+    "\0\u4c2c\0\u4c7a\0\u4cc8\0\u4d16\0\u4d64\0\u4db2\0\u4e00\0\u4e4e"+
+    "\0\u4e9c\0\u4eea\0\u4f38\0\u4f86\0\u4fd4\0\u5022\0\u5070\0\u50be"+
+    "\0\u510c\0\u515a\0\u51a8\0\u51f6\0\u5244\0\u5292\0\u52e0\0\u532e"+
+    "\0\u537c\0\u53ca\0\u5418\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e"+
+    "\0\u55ec\0\u563a\0\u5688\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e"+
+    "\0\u585c\0\u58aa\0\u58f8\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e"+
+    "\0\u5acc\0\u5b1a\0\u5b68\0\u5bb6\0\u0270\0\u5c04\0\u5c52\0\u5ca0"+
+    "\0\u5cee\0\u5d3c\0\u5d8a\0\u5dd8\0\u0270\0\u5e26\0\u5e74\0\u5ec2"+
+    "\0\u5f10\0\u5f5e\0\u5fac\0\u0270\0\u5ffa\0\u6048\0\u6096\0\u60e4"+
+    "\0\u6132\0\u6180\0\u61ce\0\u621c\0\u626a\0\u62b8\0\u6306\0\u6354"+
+    "\0\u0270\0\u63a2\0\u63f0\0\u643e\0\u648c\0\u64da\0\u6528\0\u6576"+
+    "\0\u65c4\0\u6612\0\u6660\0\u66ae\0\u66fc\0\u674a\0\u6798\0\u67e6"+
+    "\0\u6834\0\u6882\0\u68d0\0\u691e\0\u14b8\0\u696c\0\u69ba\0\u6a08"+
+    "\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e\0\u6bdc\0\u6c2a\0\u6c78"+
+    "\0\u14b8\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe\0\u6e4c\0\u6e9a"+
+    "\0\u6ee8\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e\0\u70bc\0\u710a"+
+    "\0\u7158\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de\0\u732c\0\u737a"+
+    "\0\u73c8\0\u7416\0\u7464\0\u74b2\0\u7500\0\u754e\0\u759c\0\u75ea"+
+    "\0\u7638\0\u7686\0\u76d4\0\u7722\0\u7770\0\u77be\0\u780c\0\u785a"+
+    "\0\u78a8\0\u78f6\0\u7944\0\u7992\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca"+
+    "\0\u7b18\0\u7b66\0\u7bb4\0\u7c02\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a"+
+    "\0\u7d88\0\u7dd6\0\u0270\0\u7e24\0\u7e72\0\u7ec0\0\u7f0e\0\u7f5c"+
+    "\0\u7faa\0\u7ff8\0\u8046\0\u8094\0\u80e2\0\u8130\0\u817e\0\u81cc"+
+    "\0\u821a\0\u8268\0\u82b6\0\u8304\0\u8352\0\u83a0\0\u83ee\0\u843c"+
+    "\0\u14b8\0\u14b8\0\u848a\0\u84d8\0\u8526\0\u8574\0\u85c2\0\u14b8"+
+    "\0\u8610\0\u865e\0\u86ac\0\u14b8\0\u86fa\0\u8748\0\u8796\0\u87e4"+
+    "\0\u8832\0\u8880\0\u88ce\0\u891c\0\u896a\0\u89b8\0\u8a06\0\u8a54"+
+    "\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda\0\u8c28\0\u8c76\0\u8cc4"+
+    "\0\u8d12\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a\0\u8e98\0\u8ee6\0\u8f34"+
+    "\0\u8f82\0\u8fd0\0\u901e\0\u906c\0\u90ba\0\u9108\0\u9156\0\u91a4"+
+    "\0\u91f2\0\u9240\0\u928e\0\u92dc\0\u932a\0\u9378\0\u93c6\0\u9414"+
+    "\0\u9462\0\u94b0\0\u94fe\0\u954c\0\u959a\0\u95e8\0\u9636\0\u9684"+
+    "\0\u96d2\0\u9720\0\u976e\0\u97bc\0\u980a\0\u9858\0\u98a6\0\u98f4"+
+    "\0\u9942\0\u9990\0\u99de\0\u9a2c\0\u9a7a\0\u9ac8\0\u9b16\0\u9b64"+
+    "\0\u9bb2\0\u9c00\0\u9c4e\0\u9c9c\0\u9cea\0\u01d4\0\u9d38\0\u9d86"+
+    "\0\u9dd4\0\u9e22\0\u9e70\0\u9ebe\0\u9f0c\0\u9f5a\0\u9fa8\0\u9ff6"+
+    "\0\ua044\0\ua092\0\ua0e0\0\ua12e\0\ua17c\0\ua1ca\0\ua218\0\ua266"+
+    "\0\ua2b4\0\ua302\0\ua350\0\ua39e\0\ua3ec\0\ua43a\0\ua488\0\ua4d6"+
+    "\0\ua524\0\u14b8\0\ua572\0\ua5c0\0\ua60e\0\ua65c\0\u14b8\0\ua6aa"+
+    "\0\ua6f8\0\ua746\0\ua794\0\ua7e2\0\ua830\0\ua87e\0\ua8cc\0\ua91a"+
+    "\0\ua968\0\ua9b6\0\uaa04\0\uaa52\0\u14b8\0\uaaa0\0\uaaee\0\uab3c"+
+    "\0\uab8a\0\uabd8\0\uac26\0\uac74\0\uacc2\0\u01d4\0\uad10\0\uad5e"+
+    "\0\uadac\0\uadfa\0\uae48\0\uae96\0\uaee4\0\uaf32\0\uaf80\0\uafce"+
+    "\0\ub01c\0\ub06a\0\ub0b8\0\ub106\0\ub154\0\ub1a2\0\ub1f0\0\ub23e"+
+    "\0\ub28c\0\ub2da\0\ub328\0\ub376\0\ub3c4\0\ub412\0\ub460\0\ub4ae"+
+    "\0\ub4fc\0\ub54a\0\ub598\0\ub5e6\0\ub634\0\ub682\0\ub6d0\0\ub71e"+
+    "\0\ub76c\0\ub7ba\0\ub808\0\u01d4\0\u0270\0\ub856\0\ub8a4\0\ub8f2"+
+    "\0\ub940\0\ub98e\0\ub9dc\0\uba2a\0\uba78\0\ubac6\0\ubb14\0\ubb62"+
+    "\0\ubbb0\0\ubbfe\0\u01d4\0\u01d4\0\ubc4c\0\u9d38\0\ubc9a\0\ubce8"+
+    "\0\ubd36\0\ubd84\0\ubdd2\0\ube20\0\ube6e\0\ubebc\0\ubf0a\0\ubf58"+
+    "\0\ubfa6\0\ubff4\0\uc042\0\uc090\0\uc0de\0\uc12c\0\uc17a\0\uc1c8"+
+    "\0\uc216\0\uc264\0\uc2b2\0\uc300\0\uc34e\0\uc39c\0\uc3ea\0\uc438"+
+    "\0\uc486\0\uc4d4\0\uc522\0\uc570\0\uc5be\0\uc60c\0\uc65a\0\uc6a8"+
+    "\0\uc6f6\0\uc744\0\uc792\0\uc7e0\0\uc82e\0\uc87c\0\uc8ca\0\uc918"+
+    "\0\uc966\0\uc9b4\0\uca02\0\uca50\0\uca9e\0\ucaec\0\ucb3a\0\ucb88"+
+    "\0\u0270\0\ucbd6\0\ucc24\0\ucc72\0\uccc0\0\ucd0e\0\ucd5c\0\u01d4"+
+    "\0\ucdaa\0\ucdf8\0\uce46\0\uce94\0\ucee2\0\ucf30\0\ucf7e\0\ucfcc"+
+    "\0\ud01a\0\ud068\0\ud0b6\0\ud104\0\ud152\0\ud1a0\0\ud1ee\0\ud23c"+
+    "\0\ud28a\0\ud2d8\0\ud326\0\ud374\0\ud3c2\0\ud410\0\ud45e\0\ud4ac"+
+    "\0\ud4fa\0\ud548\0\ud596\0\ud5e4\0\ud632\0\ud680\0\ud6ce\0\ud71c"+
+    "\0\ud76a\0\ud7b8\0\ud806\0\ud854\0\ud8a2\0\ud8f0\0\u0270\0\ud93e"+
+    "\0\ud98c\0\ud9da\0\uda28\0\uda76\0\udac4\0\udb12\0\udb60\0\udbae"+
+    "\0\udbfc\0\udc4a\0\udc98\0\udce6\0\udd34\0\udd82\0\uddd0\0\ude1e"+
+    "\0\ude6c\0\udeba\0\udf08\0\udf56\0\udfa4\0\udff2\0\ue040\0\ue08e"+
+    "\0\ue0dc\0\ue12a\0\ue178\0\ue1c6\0\ue214\0\ue262\0\u0270\0\ue2b0"+
+    "\0\ue2fe\0\ue34c\0\uc4d4\0\ue39a\0\ue3e8\0\u14b8\0\ue436\0\ue484"+
+    "\0\ue4d2\0\ue520\0\ue56e\0\u14b8\0\u14b8\0\ue5bc\0\ue60a\0\ue658"+
+    "\0\ue6a6\0\ue6f4\0\ue742\0\ue790\0\ue7de\0\ue82c\0\ue87a\0\ue8c8"+
+    "\0\ue916\0\ue964\0\ue9b2\0\uea00\0\uea4e\0\uea9c\0\ueaea\0\ueb38"+
+    "\0\ueb86\0\uebd4\0\uec22\0\uec70\0\uecbe\0\ued0c\0\ued5a\0\ueda8"+
+    "\0\u0270\0\uedf6\0\uee44\0\uee92\0\ueee0\0\uef2e\0\uef7c\0\uefca"+
+    "\0\uf018\0\uf066\0\uf0b4\0\uf102\0\uf150\0\uf19e\0\uf1ec\0\uf23a"+
+    "\0\uf288\0\uf2d6\0\uf324\0\uf372\0\u0270\0\uf3c0\0\uf40e\0\uf45c"+
+    "\0\uf4aa\0\uf4f8\0\uf546\0\uf594\0\uf5e2\0\uf630\0\uf67e\0\uf6cc"+
+    "\0\uf71a\0\uf768\0\uf7b6\0\uf804\0\uf852\0\uf8a0\0\u0270\0\ude6c"+
+    "\0\uf8ee\0\uf93c\0\uf98a\0\uf9d8\0\ufa26\0\ufa74\0\ufac2\0\ufb10"+
+    "\0\ufb5e\0\ufbac\0\ufbfa\0\ufc48\0\ufc96\0\ufce4\0\ufd32\0\ufd80"+
+    "\0\ufdce\0\ufe1c\0\ufe6a\0\ufeb8\0\u14b8\0\u14b8\0\uff06\0\uff54"+
+    "\0\uffa2\0\ufff0\1\76\0\u14b8\1\214\1\332\0\u14b8\1\u0128"+
+    "\1\u0176\1\u01c4\1\u0212\1\u0260\1\u02ae\0\u0270\1\u02fc\1\u034a"+
+    "\1\u0398\1\u03e6\1\u0434\1\u0482\1\u04d0\1\u051e\1\u056c\1\u05ba"+
+    "\1\u0608\1\u0656\1\u06a4\1\u06f2\1\u0740\1\u078e\1\u07dc\1\u082a"+
+    "\1\u0878\1\u08c6\1\u0914\1\u0962\1\u09b0\1\u09fe\1\u0a4c\1\u0a9a"+
+    "\1\u0ae8\0\uf630\1\u0b36\1\u0b84\1\u0bd2\1\u0c20\1\u0c6e\1\u0cbc"+
+    "\1\u0d0a\1\u0d58\1\u0da6\1\u0df4\1\u0e42\1\u0e90\1\u0ede\1\u0f2c"+
+    "\1\u0f7a\1\u0fc8\0\u14b8\0\u14b8\0\u14b8\1\u1016\1\u1064\1\u10b2"+
+    "\1\u1100\1\u114e\1\u119c\1\u11ea\1\u1238\0\u14b8\1\u1286\1\u12d4"+
+    "\1\u1322\1\u1370\1\u13be\1\u140c\1\u145a\1\u14a8\1\u14f6\1\u1544"+
+    "\1\u1592\1\u15e0\1\u162e\0\u0270\1\u167c\1\u16ca\1\u1718\1\u1766"+
+    "\1\u17b4\0\u01d4\1\u1802\1\u1850\1\u189e\1\u18ec\1\u193a\1\u1988"+
+    "\0\u01d4\1\u19d6\1\u1a24\1\u1a72\1\u1ac0\1\u1b0e\1\u1b5c\1\u1baa"+
+    "\1\u1bf8\1\u1c46\1\u1c94\1\u1ce2\1\u1d30\1\u1d7e\1\u1dcc\1\u1e1a"+
+    "\1\u1e68\1\u1eb6\1\u1f04\1\u1f52\1\u1fa0\1\u1fee\1\u203c\1\u208a"+
+    "\1\u20d8\1\u2126\1\u2174\1\u21c2\1\u2210\0\u01d4\1\u225e\1\u22ac"+
+    "\1\u22fa\1\u2348\1\u2396\1\u23e4\1\u2432\1\u2480\1\u24ce\1\u251c"+
+    "\1\u256a\0\u01d4\0\u01d4\1\u25b8\1\u2606\0\u0270\1\u2654\1\u26a2"+
+    "\1\u26f0\1\u273e\1\u278c\1\u27da\1\u2828\1\u2876\1\u28c4\1\u2912"+
+    "\1\u2960\1\u29ae\1\u29fc\1\u2a4a\1\u2a98\1\u2ae6\1\u2b34\1\u2b82"+
+    "\1\u2bd0\1\u2c1e\1\u2c6c\0\u01d4\0\u0270\0\u0270\1\u2cba\1\u2d08"+
+    "\1\u2d56\1\u2da4\1\u2df2\1\u2e40\1\u2e8e\1\u2edc\1\u2f2a\1\u2f78"+
+    "\1\u2fc6\1\u3014\1\u3062\1\u30b0\0\u14b8\0\u14b8\0\u14b8\1\u30fe"+
+    "\1\u314c\1\u319a\1\u31e8\1\u3236\0\u14b8\1\u3284\1\u32d2\1\u3320"+
+    "\1\u336e\1\u33bc\1\u340a\1\u3458\1\u34a6\1\u34f4\1\u3542\1\u3590"+
+    "\1\u35de\1\u362c\1\u367a\0\u14b8\0\u14b8\1\u36c8\1\u3716\1\u3764"+
+    "\1\u37b2\1\u3800\1\u384e\1\u389c\1\u38ea\1\u3938\1\u3986\1\u39d4"+
+    "\1\u3a22\1\u3a70\1\u3abe\1\u3b0c\1\u3b5a\1\u3ba8\1\u3bf6\1\u3c44"+
+    "\1\u3c92\1\u3ce0\1\u3d2e\1\u3d7c\1\u3dca\1\u3e18\1\u3e66\1\u3eb4"+
+    "\1\u3f02\1\u3f50\1\u3f9e\1\u3fec\1\u403a\1\u4088\1\u40d6\1\u4124"+
+    "\0\u01d4\1\u4172\1\u41c0\1\u420e\1\u425c\0\u01d4\1\u42aa\1\u42f8"+
+    "\1\u4346\1\u4394\0\u14b8\0\u14b8\0\u14b8\0\u01d4\1\u43e2\1\u4430"+
+    "\1\u447e\1\u44cc\1\u451a\1\u4568\0\u0270\1\u45b6\1\u4604\0\u0270"+
+    "\1\u4652\1\u46a0\1\u46ee\1\u473c\1\u478a\0\u01d4\1\u47d8\1\u4826"+
+    "\1\u4874\1\u48c2\1\u4910\1\u495e\1\u49ac\1\u49fa\1\u4a48\0\u01d4"+
+    "\1\u4a96\1\u4ae4\1\u4b32\1\u4b80\1\u4bce\0\u01d4\0\u01d4\0\u01d4"+
+    "\0\u0270";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[1209];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /**
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\7\1\10\1\11\1\12\2\13\1\11\1\14\1\11"+
+    "\1\15\1\16\1\17\3\11\1\20\1\21\1\7\1\11"+
+    "\1\22\1\23\2\22\1\24\2\7\1\25\1\26\1\27"+
+    "\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37"+
+    "\1\40\1\41\1\42\1\43\1\11\1\44\3\11\1\7"+
+    "\1\11\2\22\1\45\1\46\1\43\1\7\1\47\1\11"+
+    "\1\7\1\50\1\51\1\13\1\11\3\13\1\11\2\13"+
+    "\1\52\1\53\1\7\1\54\1\55\1\56\1\57\1\60"+
+    "\1\61\1\62\1\43\23\63\4\64\31\63\2\64\57\63"+
+    "\4\65\1\66\2\63\1\67\25\63\2\65\57\63\4\70"+
+    "\1\71\30\63\2\70\34\63\62\72\1\73\1\72\1\74"+
+    "\1\75\30\72\63\76\1\77\1\100\1\101\30\76\117\0"+
+    "\1\102\1\103\1\11\1\104\1\102\1\105\4\11\1\106"+
+    "\1\107\2\11\1\110\1\111\1\0\3\11\1\106\1\11"+
+    "\1\112\3\0\1\11\1\112\1\11\1\113\2\11\1\105"+
+    "\3\11\1\107\1\11\1\114\1\0\5\11\1\0\1\11"+
+    "\1\113\1\114\4\0\2\11\1\0\1\103\1\0\1\102"+
+    "\1\11\3\102\1\11\1\104\1\102\1\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\4\11"+
+    "\1\115\2\11\1\116\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\1\13"+
+    "\2\11\2\13\1\105\4\11\1\106\1\107\2\11\1\110"+
+    "\1\111\1\0\3\11\1\106\1\11\1\112\3\0\1\11"+
+    "\1\112\1\11\1\113\2\11\1\105\3\11\1\107\1\11"+
+    "\1\114\1\0\5\11\1\0\1\11\1\113\1\114\4\0"+
+    "\2\11\1\0\1\11\1\0\1\13\1\11\3\13\1\11"+
+    "\2\13\1\11\13\0\1\117\2\11\2\120\3\11\1\121"+
+    "\5\11\1\122\1\111\1\0\2\11\1\121\3\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\1\120\1\11\3\120\1\11\2\120\1\11"+
+    "\1\0\1\123\11\0\11\11\1\124\1\125\3\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\11\1\126\3\11\1\127"+
+    "\3\11\1\130\3\11\1\0\1\11\1\131\3\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\15\11\1\132\1\0\1\111\1\0\6\11\3\0\2\11"+
+    "\1\132\12\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\10\11\1\133\5\11"+
+    "\1\0\1\111\1\0\6\11\3\0\1\11\1\134\1\135"+
+    "\12\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\1\110\2\136\2\110\3\136"+
+    "\1\137\1\136\1\140\3\136\1\141\3\0\5\136\2\0"+
+    "\1\136\1\142\1\143\1\144\1\145\1\136\1\146\1\147"+
+    "\1\150\1\151\4\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\1\110\1\136\3\110\1\136\2\110\1\136"+
+    "\33\0\1\11\75\0\16\11\1\0\1\111\1\0\1\11"+
+    "\4\152\1\153\2\0\1\154\15\11\1\0\5\11\1\0"+
+    "\1\11\2\152\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\11\11\1\124\4\11\1\0\1\111\1\0\1\11"+
+    "\4\152\1\153\2\0\1\154\11\11\1\124\3\11\1\0"+
+    "\5\11\1\0\1\11\2\152\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\155\1\0\1\156\1\0\6\155"+
+    "\3\0\15\155\1\0\5\155\1\0\3\155\4\0\2\155"+
+    "\1\0\1\155\1\0\11\155\35\0\4\154\1\157\2\0"+
+    "\1\25\25\0\2\154\35\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\160\6\11\1\161\2\11\1\162"+
+    "\1\11\1\0\1\163\4\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\13\11\1\164\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\2\11\1\165\13\11\1\0\1\111\1\0\6\11"+
+    "\3\0\5\11\1\166\1\11\1\167\1\11\1\170\2\11"+
+    "\1\171\1\0\1\11\1\172\3\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\4\11\1\173\1\174\4\11"+
+    "\1\175\2\11\1\0\1\176\1\177\1\200\2\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\3\11\1\201"+
+    "\11\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\1\202\2\11\2\202\11\11"+
+    "\1\0\1\111\1\0\6\11\3\0\2\11\1\203\1\11"+
+    "\1\204\2\11\1\205\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\1\202\1\11\3\202"+
+    "\1\11\2\202\1\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\11\11\1\206\3\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\207\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\3\11\1\210"+
+    "\1\211\1\11\1\212\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\4\11\1\213\6\11"+
+    "\1\214\1\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\15\11\1\132\1\0"+
+    "\1\111\1\0\6\11\3\0\2\11\1\215\1\11\1\216"+
+    "\1\11\1\217\4\11\1\220\1\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\7\11\1\221"+
+    "\5\11\1\0\1\222\4\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\7\11\1\223\5\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\10\11\1\224\5\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\225\4\11\1\226\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\62\0\1\43\13\0\1\43\30\0\1\43\1\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\6\11\1\227\4\11"+
+    "\1\230\1\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\1\202\2\11\2\202"+
+    "\11\11\1\0\1\111\1\0\6\11\3\0\2\11\1\231"+
+    "\7\11\1\232\1\233\1\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\1\202\1\11\3\202"+
+    "\1\11\2\202\1\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\13\11\1\41\1\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\12\0"+
+    "\64\51\1\0\31\51\1\0\16\234\1\0\1\235\1\0"+
+    "\6\234\3\0\15\234\1\0\5\234\1\0\3\234\4\0"+
+    "\2\234\1\0\1\234\1\0\11\234\13\0\16\236\1\0"+
+    "\1\237\1\0\6\236\3\0\15\236\1\0\5\236\1\0"+
+    "\3\236\4\0\2\236\1\0\1\236\1\0\11\236\44\0"+
+    "\1\67\64\0\16\240\1\0\1\241\1\0\6\240\3\0"+
+    "\15\240\1\0\5\240\1\0\3\240\4\0\2\240\1\0"+
+    "\1\240\1\0\11\240\12\0\62\72\1\0\1\72\2\0"+
+    "\30\72\3\242\1\243\7\242\1\244\23\242\1\245\2\242"+
+    "\1\246\1\242\1\247\1\250\14\242\1\251\1\252\1\242"+
+    "\1\253\30\242\63\76\3\0\30\76\3\242\1\243\7\242"+
+    "\1\244\23\242\1\254\2\242\1\246\1\242\1\247\1\250"+
+    "\14\242\1\251\1\252\1\242\1\253\30\242\1\0\1\102"+
+    "\2\11\1\104\1\102\1\105\4\11\1\106\1\107\2\11"+
+    "\1\110\1\111\1\0\3\11\1\106\1\11\1\112\3\0"+
+    "\1\11\1\112\1\11\1\113\2\11\1\105\3\11\1\107"+
+    "\1\11\1\114\1\0\5\11\1\0\1\11\1\113\1\114"+
+    "\4\0\2\11\1\0\1\11\1\0\1\102\1\11\3\102"+
+    "\1\11\1\104\1\102\1\11\13\0\1\255\1\11\4\255"+
+    "\4\11\1\255\2\11\1\255\1\256\1\111\1\0\1\11"+
+    "\1\255\1\11\1\255\2\11\3\0\1\255\1\11\1\255"+
+    "\3\11\1\255\5\11\1\255\1\0\5\11\1\0\2\11"+
+    "\1\255\4\0\2\11\1\0\1\11\1\0\1\255\1\11"+
+    "\3\255\1\11\2\255\1\11\13\0\1\104\2\11\2\104"+
+    "\1\105\4\11\1\106\3\11\1\110\1\111\1\0\3\11"+
+    "\1\106\2\11\3\0\6\11\1\105\5\11\1\114\1\0"+
+    "\5\11\1\0\2\11\1\114\4\0\2\11\1\0\1\11"+
+    "\1\0\1\104\1\11\3\104\1\11\2\104\1\11\13\0"+
+    "\1\257\2\11\2\257\1\11\1\260\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\1\257\1\11\3\257"+
+    "\1\11\2\257\1\11\13\0\1\110\2\0\2\110\1\261"+
+    "\4\0\1\262\11\0\1\262\13\0\1\261\5\0\1\263"+
+    "\11\0\1\263\11\0\1\110\1\0\3\110\1\0\2\110"+
+    "\14\0\10\11\1\264\5\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\10\11\1\265\5\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\1\266\1\267\1\11\1\104\1\266\1\105\4\11"+
+    "\1\106\1\107\2\11\1\110\1\111\1\0\3\11\1\106"+
+    "\1\11\1\112\3\0\1\11\1\112\1\11\1\113\2\11"+
+    "\1\105\3\11\1\107\1\11\1\114\1\0\5\11\1\0"+
+    "\1\11\1\113\1\114\4\0\2\11\1\0\1\267\1\0"+
+    "\1\266\1\11\3\266\1\11\1\104\1\266\1\11\13\0"+
+    "\1\120\2\11\2\120\1\105\4\11\1\106\1\107\2\11"+
+    "\1\110\1\111\1\0\3\11\1\106\1\11\1\112\3\0"+
+    "\1\11\1\112\1\11\1\113\2\11\1\105\3\11\1\107"+
+    "\1\11\1\114\1\0\5\11\1\0\1\11\1\113\1\114"+
+    "\4\0\2\11\1\0\1\11\1\0\1\120\1\11\3\120"+
+    "\1\11\2\120\1\11\13\0\11\11\1\124\4\11\1\0"+
+    "\1\111\1\0\6\11\3\0\11\11\1\124\3\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\1\110\2\0\2\110\65\0\1\110\1\0"+
+    "\3\110\1\0\2\110\14\0\12\11\1\270\3\11\1\0"+
+    "\1\111\1\0\3\11\1\270\2\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\6\11\1\271\7\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\11\1\272\13\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\4\11\1\273\10\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\12\11\1\270"+
+    "\3\11\1\0\1\111\1\0\3\11\1\270\2\11\3\0"+
+    "\1\11\1\274\1\11\1\275\6\11\1\276\2\11\1\0"+
+    "\5\11\1\0\3\11\4\0\1\277\1\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\300\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\11\11"+
+    "\1\301\4\11\1\0\1\111\1\0\6\11\3\0\11\11"+
+    "\1\301\3\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\11\1\302\4\11\1\303\2\11"+
+    "\1\304\3\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\13\11\1\305\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\11"+
+    "\1\306\13\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\136\4\0\5\136"+
+    "\2\0\16\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\11\136"+
+    "\1\307\4\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\10\136\1\310\5\136\4\0\5\136"+
+    "\2\0\16\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\2\136"+
+    "\1\311\1\312\12\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\10\136\1\313\5\136\4\0"+
+    "\5\136\2\0\14\136\1\314\1\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\10\136\1\315\1\136\1\316\3\136\1\0"+
+    "\11\136\3\0\3\136\1\0\1\136\1\0\11\136\13\0"+
+    "\16\136\4\0\5\136\2\0\5\136\1\317\1\320\5\136"+
+    "\1\321\1\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\3\136"+
+    "\1\322\4\136\1\323\5\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\6\136\1\324\3\136\1\325\3\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\7\136\1\326\6\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\7\136\1\327\6\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\330"+
+    "\1\0\1\331\1\0\6\330\3\0\15\330\1\0\5\330"+
+    "\1\0\3\330\4\0\2\330\1\0\1\330\1\0\11\330"+
+    "\35\0\4\332\1\333\2\0\1\154\25\0\2\332\35\0"+
+    "\16\155\1\0\1\156\1\0\6\155\1\334\1\335\1\0"+
+    "\15\155\1\0\5\155\1\0\3\155\4\0\2\155\1\0"+
+    "\1\155\1\0\11\155\33\0\1\155\75\0\16\336\1\0"+
+    "\1\337\1\0\6\336\3\0\15\336\1\0\5\336\1\0"+
+    "\3\336\4\0\2\336\1\0\1\336\1\0\11\336\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\2\11\1\340"+
+    "\12\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\5\11\1\341\7\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\11\11\1\342"+
+    "\3\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\6\11\1\343\6\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\11\11\1\344"+
+    "\3\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\3\11\1\345\11\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\4\11\1\346"+
+    "\10\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\7\11\1\347\5\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\11\11\1\350"+
+    "\2\11\1\223\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\14\11\1\351\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\346"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\2\11\1\352\13\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\2\11\1\353"+
+    "\1\11\1\354\10\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\2\11\1\355\4\11\1\356"+
+    "\5\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\357\5\11\1\357\5\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\6\11\1\354\6\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\3\11\1\360\5\11\1\361"+
+    "\3\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\1\362\4\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\1\202"+
+    "\2\11\2\202\11\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\1\202\1\11\3\202\1\11\2\202\1\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\363"+
+    "\14\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\2\11\1\364\13\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\10\11\1\365\5\11\1\0\1\111\1\0\6\11\3\0"+
+    "\13\11\1\366\1\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\4\11\1\367\10\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\6\11\1\370\6\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\4\11\1\371\10\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\11\11\1\372\3\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\10\11\1\351\1\11\1\373"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\351\13\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\11\11\1\374"+
+    "\3\11\1\0\5\11\1\0\3\11\4\0\1\375\1\11"+
+    "\1\0\1\11\1\0\11\11\13\0\11\11\1\301\4\11"+
+    "\1\0\1\111\1\0\6\11\3\0\11\11\1\301\1\376"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\377\13\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\1\11\1\u0100\2\11\1\u0101\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\6\11\1\u0102\7\11"+
+    "\1\0\1\111\1\0\6\11\3\0\5\11\1\u0103\4\11"+
+    "\1\u0104\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\2\11\1\u0105\1\11\1\u0106\10\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u0107\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\6\11"+
+    "\1\u0108\7\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\1\351"+
+    "\1\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\u0109\14\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\4\11"+
+    "\1\u010a\10\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\11\11\1\u010b\3\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u010c\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\7\11\1\u010d\5\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\2\11"+
+    "\1\u010e\12\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\11\1\u010f\13\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\234\1\0\1\235\1\0\6\234\3\0\15\234"+
+    "\1\0\5\234\1\0\3\234\4\0\2\234\1\0\1\234"+
+    "\1\0\11\234\1\0\1\u0110\31\0\1\234\75\0\16\236"+
+    "\1\0\1\237\1\0\6\236\1\u0111\1\u0112\1\0\15\236"+
+    "\1\0\5\236\1\0\3\236\4\0\2\236\1\0\1\236"+
+    "\1\0\11\236\33\0\1\236\75\0\16\240\1\0\1\241"+
+    "\1\0\6\240\1\u0113\1\u0114\1\0\15\240\1\0\5\240"+
+    "\1\0\3\240\4\0\2\240\1\0\1\240\1\0\11\240"+
+    "\33\0\1\240\75\0\1\u0115\1\0\4\u0115\4\0\1\u0115"+
+    "\2\0\1\u0115\4\0\1\u0115\1\0\1\u0115\5\0\1\u0115"+
+    "\1\0\1\u0115\3\0\1\u0115\5\0\1\u0115\11\0\1\u0115"+
+    "\11\0\1\u0115\1\0\3\u0115\1\0\2\u0115\14\0\1\u0116"+
+    "\1\0\4\u0116\4\0\1\u0116\2\0\1\u0116\4\0\1\u0116"+
+    "\1\0\1\u0116\5\0\1\u0116\1\0\1\u0116\3\0\1\u0116"+
+    "\5\0\1\u0116\11\0\1\u0116\11\0\1\u0116\1\0\3\u0116"+
+    "\1\0\2\u0116\14\0\1\255\1\11\4\255\1\11\1\105"+
+    "\2\11\1\255\1\107\1\11\1\255\1\u0117\1\111\1\0"+
+    "\1\11\1\255\1\11\1\255\1\11\1\112\3\0\1\255"+
+    "\1\112\1\255\1\113\1\11\1\105\1\255\3\11\1\107"+
+    "\1\11\1\255\1\0\5\11\1\0\1\11\1\113\1\255"+
+    "\4\0\2\11\1\0\1\11\1\0\1\255\1\11\3\255"+
+    "\1\11\2\255\1\11\13\0\1\u0117\1\0\4\u0117\4\0"+
+    "\1\u0117\2\0\1\u0117\4\0\1\u0117\1\0\1\u0117\5\0"+
+    "\1\u0117\1\0\1\u0117\3\0\1\u0117\5\0\1\u0117\11\0"+
+    "\1\u0117\11\0\1\u0117\1\0\3\u0117\1\0\2\u0117\14\0"+
+    "\1\257\2\11\2\257\5\11\1\106\3\11\1\0\1\111"+
+    "\1\0\3\11\1\106\2\11\3\0\14\11\1\114\1\0"+
+    "\5\11\1\0\2\11\1\114\4\0\2\11\1\0\1\11"+
+    "\1\0\1\257\1\11\3\257\1\11\2\257\1\11\13\0"+
+    "\1\257\2\11\2\257\11\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\1\257\1\11\3\257\1\11\2\257"+
+    "\1\11\13\0\1\u0118\2\0\2\u0118\1\0\1\u0119\63\0"+
+    "\1\u0118\1\0\3\u0118\1\0\2\u0118\14\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\11\1\u011a\13\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\14\11\1\u011b\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\1\266\2\11\1\104"+
+    "\1\266\1\105\4\11\1\106\1\107\2\11\1\110\1\111"+
+    "\1\0\3\11\1\106\1\11\1\112\3\0\1\11\1\112"+
+    "\1\11\1\113\2\11\1\105\3\11\1\107\1\11\1\114"+
+    "\1\0\5\11\1\0\1\11\1\113\1\114\4\0\2\11"+
+    "\1\0\1\11\1\0\1\266\1\11\3\266\1\11\1\104"+
+    "\1\266\1\11\13\0\1\u011c\1\11\4\u011c\4\11\1\u011c"+
+    "\2\11\1\u011c\1\256\1\111\1\0\1\11\1\u011c\1\11"+
+    "\1\u011c\2\11\3\0\1\u011c\1\11\1\u011c\3\11\1\u011c"+
+    "\5\11\1\u011c\1\0\5\11\1\0\2\11\1\u011c\4\0"+
+    "\2\11\1\0\1\11\1\0\1\u011c\1\11\3\u011c\1\11"+
+    "\2\u011c\1\11\13\0\10\11\1\u011d\5\11\1\0\1\111"+
+    "\1\0\2\11\1\u011d\3\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\11"+
+    "\1\u011e\4\11\1\u011f\2\11\1\u0120\3\11\1\0\1\11"+
+    "\1\u011e\3\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u0121\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u0122\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u0123\5\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u0124\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\6\11\1\u0125\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u0126\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\13\11"+
+    "\1\u0127\1\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\12\11\1\u0128\2\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\12\11\1\106\3\11\1\0\1\111\1\0\3\11"+
+    "\1\106\2\11\3\0\14\11\1\114\1\0\5\11\1\0"+
+    "\2\11\1\114\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\11"+
+    "\1\u0129\13\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\11\1\u012a\13\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\2\11"+
+    "\1\u012b\12\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\2\11\1\u012c\12\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\3\11"+
+    "\1\u0106\11\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\136\4\0\5\136"+
+    "\2\0\6\136\1\u012d\7\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\7\136\1\u012e\6\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\3\136\1\u012f\12\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\13\136\1\u0130\2\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\12\136\1\u0131\3\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\1\136\1\u0132\14\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\10\136\1\u0133\5\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\12\136\1\u0134\3\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\2\136\1\u0135\13\136"+
+    "\4\0\5\136\2\0\6\136\1\u0136\7\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\3\136\1\u0137\12\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\5\136\1\u0138\10\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\1\136\1\u0139\6\136\1\u013a\5\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\14\136\1\u013b\1\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\10\136\1\u013c\5\136\4\0\5\136\2\0\16\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\5\136\1\u013d\7\136"+
+    "\1\u013e\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\4\136\1\u013f"+
+    "\11\136\1\0\1\136\1\u0140\7\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\13\136\1\u0141\2\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\330\1\0\1\331\1\0"+
+    "\6\330\1\333\1\332\1\0\15\330\1\0\5\330\1\0"+
+    "\3\330\4\0\2\330\1\0\1\330\1\0\11\330\33\0"+
+    "\1\330\75\0\16\u0142\1\0\1\u0143\1\0\6\u0142\3\0"+
+    "\15\u0142\1\0\5\u0142\1\0\3\u0142\4\0\2\u0142\1\0"+
+    "\1\u0142\1\0\11\u0142\13\0\16\u0144\1\0\1\u0145\1\0"+
+    "\6\u0144\3\0\15\u0144\1\0\5\u0144\1\0\3\u0144\4\0"+
+    "\2\u0144\1\0\1\u0144\1\0\11\u0144\13\0\16\336\1\0"+
+    "\1\337\1\0\6\336\1\157\1\154\1\0\15\336\1\0"+
+    "\5\336\1\0\3\336\4\0\2\336\1\0\1\336\1\0"+
+    "\11\336\33\0\1\336\75\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\3\11\1\u0146\11\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\6\11\1\u0147\7\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\11\1\u0148\13\11\1\0\1\11\1\u0148\3\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\3\11\1\u0149"+
+    "\11\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\u014a\14\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\1\11"+
+    "\1\u014b\3\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\12\11\1\u014c\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u014d\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\2\11\1\u014e\12\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u014f\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\6\11\1\u0150\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\6\11"+
+    "\1\u0151\7\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u0152\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u0153\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\12\11\1\u0154\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\10\11"+
+    "\1\u0155\5\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\6\11\1\u0156\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u0157\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\u0158\11\11\1\u0159\2\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\7\11\1\357"+
+    "\5\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\3\11\1\u015a\1\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\1\11\1\u0154"+
+    "\13\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\1\u015b\1\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u015c\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\10\11\1\u015d\4\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\1\u015e\14\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\2\11\1\u015f\13\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\12\11\1\u0160\2\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\4\11\1\u0161\10\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\10\11\1\u0162"+
+    "\5\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\6\11\1\u0163\6\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\10\11\1\u0164"+
+    "\5\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\11\1\u0165\13\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\6\11\1\u0166"+
+    "\7\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\6\11\1\u0167\7\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\3\11\1\u0168\2\11\1\u0169"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\6\11\1\u016a\7\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\11\11\1\u016b"+
+    "\3\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\6\11\1\u016c\6\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\13\11\1\u016d"+
+    "\1\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\10\11\1\u016e\5\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\11\1\u016f\13\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\11\1\u0170\13\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\2\11\1\u0171"+
+    "\13\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\6\11\1\u0172\6\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\13\11\1\u0173\1\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\2\11\1\u0174\12\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\2\11\1\u0175"+
+    "\13\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\2\11\1\u0176\12\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\1\u0177\1\0"+
+    "\4\u0177\4\0\1\u0177\2\0\1\u0177\4\0\1\u0177\1\0"+
+    "\1\u0177\5\0\1\u0177\1\0\1\u0177\3\0\1\u0177\5\0"+
+    "\1\u0177\11\0\1\u0177\11\0\1\u0177\1\0\3\u0177\1\0"+
+    "\2\u0177\14\0\1\u0178\1\0\4\u0178\4\0\1\u0178\2\0"+
+    "\1\u0178\4\0\1\u0178\1\0\1\u0178\5\0\1\u0178\1\0"+
+    "\1\u0178\3\0\1\u0178\5\0\1\u0178\11\0\1\u0178\11\0"+
+    "\1\u0178\1\0\3\u0178\1\0\2\u0178\14\0\1\u0117\1\0"+
+    "\4\u0117\1\0\1\261\2\0\1\u0117\2\0\1\u0117\4\0"+
+    "\1\u0117\1\0\1\u0117\5\0\1\u0117\1\0\1\u0117\2\0"+
+    "\1\261\1\u0117\5\0\1\u0117\11\0\1\u0117\11\0\1\u0117"+
+    "\1\0\3\u0117\1\0\2\u0117\14\0\1\u0118\2\0\2\u0118"+
+    "\5\0\1\262\11\0\1\262\21\0\1\263\11\0\1\263"+
+    "\11\0\1\u0118\1\0\3\u0118\1\0\2\u0118\14\0\1\u0118"+
+    "\2\0\2\u0118\65\0\1\u0118\1\0\3\u0118\1\0\2\u0118"+
+    "\14\0\16\11\1\0\1\111\1\0\6\11\3\0\14\11"+
+    "\1\u0179\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\1\11\1\u017a\3\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\1\u011c\1\11\4\u011c\1\11\1\105\2\11\1\u011c\1\107"+
+    "\1\11\1\u011c\1\u0117\1\111\1\0\1\11\1\u011c\1\11"+
+    "\1\u011c\1\11\1\112\3\0\1\u011c\1\112\1\u011c\1\113"+
+    "\1\11\1\105\1\u011c\3\11\1\107\1\11\1\u011c\1\0"+
+    "\5\11\1\0\1\11\1\113\1\u011c\4\0\2\11\1\0"+
+    "\1\11\1\0\1\u011c\1\11\3\u011c\1\11\2\u011c\1\11"+
+    "\13\0\11\11\1\u017b\4\11\1\0\1\111\1\0\6\11"+
+    "\3\0\11\11\1\u017b\3\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\6\11\1\u017c\3\11"+
+    "\1\u017c\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\5\11\1\u017c\3\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\u017c\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\1\11\1\u017d\3\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\6\11\1\u017e\7\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\11\11\1\u017f\3\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\2\11"+
+    "\1\u0180\12\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\12\11\1\u0181\2\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\7\11"+
+    "\1\u0182\5\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\3\11\1\u0183\1\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\6\11\1\u0184\7\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\6\11\1\u0185\7\11"+
+    "\1\0\1\111\1\0\6\11\3\0\6\11\1\u0186\6\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\14\11\1\u0187\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\11\1\u015d\13\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\12\11\1\u0188\2\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\136\4\0"+
+    "\5\136\2\0\2\136\1\u0189\13\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\2\136\1\u018a\13\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\4\136\1\u018b\11\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\1\136\1\u018c\14\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\7\136\1\u018d\6\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\3\136\1\u018e\12\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\3\136\1\u018f\12\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\14\136\1\u0190\1\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\3\136\1\u0191\12\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\7\136\1\u0192\6\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\10\136\1\u0193\5\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\10\136\1\u0194\5\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\16\136\1\0\3\136\1\u0195\5\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\3\136\1\u0196\12\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\2\136\1\u0197\13\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\2\136\1\u0198\13\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\11\136\1\u0199\4\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\16\136\1\u019a\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\13\136\1\u019b\2\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\10\136\1\u019c\5\136\4\0"+
+    "\5\136\2\0\16\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\16\136\1\0\1\u019d\10\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\u0142\1\0\1\u0143\1\0\6\u0142"+
+    "\1\333\1\332\1\0\15\u0142\1\0\5\u0142\1\0\3\u0142"+
+    "\4\0\2\u0142\1\0\1\u0142\1\0\11\u0142\33\0\1\u0142"+
+    "\75\0\16\u0144\1\0\1\u0145\1\0\6\u0144\1\334\1\335"+
+    "\1\0\15\u0144\1\0\5\u0144\1\0\3\u0144\4\0\2\u0144"+
+    "\1\0\1\u0144\1\0\11\u0144\33\0\1\u0144\75\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\3\11\1\u019e\11\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\11\1\u019f\13\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\6\11"+
+    "\1\u01a0\7\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\12\11\1\u01a1\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\3\11"+
+    "\1\u01a2\1\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\6\11\1\u01a3\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\7\11\1\u01a4\5\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\6\11\1\u01a5\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\2\11"+
+    "\1\u01a6\2\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\12\11\1\u01a7\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\10\11"+
+    "\1\u016e\1\11\1\u01a8\3\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\11\1\u016f\12\11\1\u01a9\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\10\11\1\u01aa\1\11\1\u01a8\3\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\u016f\12\11\1\u01a9\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\3\11"+
+    "\1\u01ab\11\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\6\11\1\u01ac\7\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\10\11\1\u01ad\5\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\u01ae\14\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\10\11\1\u01af\5\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\11\1\u016f\13\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\6\11\1\u01b0\6\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\1\u01b1\4\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\1\u01b2\4\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\u01b3"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\2\11\1\u01b4\12\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\u01b5"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\4\11\1\u01b6\10\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\6\11\1\u01b7\7\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\10\11\1\u01b8\5\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\7\11\1\u01b9"+
+    "\5\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\12\11\1\u01ba\2\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\6\11\1\u01bb\7\11\1\0\1\111\1\0\6\11\1\u01bc"+
+    "\2\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\1\u017a\1\11\1\0\1\11\1\0\11\11\13\0"+
+    "\10\11\1\u01bd\1\11\1\u01be\3\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\u01bf\12\11\1\u01c0\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\10\11\1\u01c1\5\11\1\0\1\111\1\0\6\11"+
+    "\3\0\2\11\1\u01c2\12\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\4\11\1\u01c3\10\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u01c4\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\10\11"+
+    "\1\u01bd\5\11\1\0\1\111\1\0\6\11\3\0\1\11"+
+    "\1\u01bf\13\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\3\11\1\u01c5\11\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\4\11\1\u01c6\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\11\11\1\u01c7\3\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\13\11\1\u01c8"+
+    "\1\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\2\11\1\u01c9\12\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\1\11\1\u01ca"+
+    "\13\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\7\11\1\u01cb\5\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\1\u01cc\2\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u01cd\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\1\11\1\u01ce\13\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\12\11\1\u01cf\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\1\u01d0"+
+    "\1\0\4\u01d0\4\0\1\u01d0\2\0\1\u01d0\4\0\1\u01d0"+
+    "\1\0\1\u01d0\5\0\1\u01d0\1\0\1\u01d0\3\0\1\u01d0"+
+    "\5\0\1\u01d0\11\0\1\u01d0\11\0\1\u01d0\1\0\3\u01d0"+
+    "\1\0\2\u01d0\14\0\1\u01d1\1\0\4\u01d1\4\0\1\u01d1"+
+    "\2\0\1\u01d1\4\0\1\u01d1\1\0\1\u01d1\5\0\1\u01d1"+
+    "\1\0\1\u01d1\3\0\1\u01d1\5\0\1\u01d1\11\0\1\u01d1"+
+    "\11\0\1\u01d1\1\0\3\u01d1\1\0\2\u01d1\14\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\6\11\1\u015d\6\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u01d2\5\11\1\0\1\111"+
+    "\1\0\2\11\1\u01d2\3\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\1\11\1\u01d3\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\2\11\1\u01d4\12\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\2\11\1\u01d5\13\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\u01d6\2\11\1\u01d7\7\11\1\u01d8\1\11\1\0\4\11"+
+    "\1\u01d9\1\0\3\11\4\0\1\u01da\1\11\1\0\1\11"+
+    "\1\0\5\11\1\u01db\3\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u01dc\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\11\11"+
+    "\1\u01dd\3\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\13\11\1\u01de\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\12\11\1\u01df\3\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u01e0\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\2\11\1\u01e1\13\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\u01e2\2\11\1\u01e3\7\11\1\u01d8\1\11\1\0"+
+    "\4\11\1\u01d9\1\0\3\11\4\0\1\u01da\1\11\1\0"+
+    "\1\11\1\0\5\11\1\u01db\3\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\2\11\1\u01e4\12\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\14\11\1\u01e5\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\u01e6\1\11\1\0\11\11\13\0\6\11"+
+    "\1\u01e7\7\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\136\4\0\5\136\2\0\7\136"+
+    "\1\u01e8\6\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\15\136"+
+    "\1\u01e9\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\4\136\1\u01ea"+
+    "\11\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\16\136\1\0"+
+    "\1\u01eb\10\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\2\136\1\u01ec\13\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\16\136\1\0\2\136"+
+    "\1\u01ed\6\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\13\136\1\u01ee\2\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\12\136\1\u01ef\3\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\10\136\1\u01f0\5\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\4\136\1\u01f1\11\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\1\136\1\u01f2\14\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\7\136\1\u01f3\6\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\11\136\1\u01f4\4\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\14\136\1\u01f5\1\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\14\136\1\u01f6\1\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\12\136\1\u01f7\3\136\4\0\5\136\2\0\2\136"+
+    "\1\u01f8\1\u01f9\1\u01fa\1\136\1\u01fb\2\136\1\u01fc\4\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\3\136\1\u01fd\12\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\4\136\1\u01fe\11\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\14\136\1\u01ff\1\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\6\11\1\u0200\7\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\13\11\1\u0201\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\12\11\1\u0202\3\11\1\0\1\111\1\0\6\11"+
+    "\3\0\14\11\1\u0203\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\6\11\1\u0204"+
+    "\7\11\1\0\1\111\1\0\6\11\1\u0205\2\0\7\11"+
+    "\1\u0206\5\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\6\11\1\u0207\7\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u0208\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\2\11\1\u0209\12\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\2\11\1\u020a\13\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\u020b\2\11\1\u020c\7\11\1\u020d\1\11\1\0"+
+    "\4\11\1\u020e\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\6\11\1\u020f\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\2\11\1\u0210\12\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\11\1\u0211\13\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u0212\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\11\11\1\u0213\3\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\6\11\1\u0214\6\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\2\11\1\u0215\13\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\u0216\2\11\1\u0217\7\11\1\u0218"+
+    "\1\11\1\0\4\11\1\u0219\1\0\3\11\4\0\1\u021a"+
+    "\1\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\u015d\14\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u021b\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\11\11\1\u021c\3\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\10\11"+
+    "\1\u0179\4\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\7\11\1\u021d\5\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\355\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\14\11\1\u0214\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u017a"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\u021e\14\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u021f\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u0220\5\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\10\11\1\u0221\4\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\11\11\1\u0222\3\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u0223\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u0224\1\u0225\3\11\1\u0226\1\11\1\0"+
+    "\4\11\1\u0227\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\25\0\1\u0228\62\0\1\u0229\20\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\11\11\1\u022a\3\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\11\1\u022b\13\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u022c\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\13\11\1\u022d\1\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\11\11\1\u022e\3\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u022f\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\1\u0230\14\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\7\11\1\u0231\5\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\10\11\1\u0232"+
+    "\5\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\6\11\1\u0233\7\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\12\11\1\u0234\2\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\11\11\1\u0235\3\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\7\11\1\u0236\5\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\6\11\1\u0237\6\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\10\11\1\u0238"+
+    "\5\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\110\0\1\u0239\3\0\1\u023a\14\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\1\11\1\u023b"+
+    "\3\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\6\11\1\u023c\6\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\10\11\1\u023d"+
+    "\5\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\1\u023e\1\0\4\u023e\4\0\1\u023e\2\0"+
+    "\1\u023e\4\0\1\u023e\1\0\1\u023e\5\0\1\u023e\1\0"+
+    "\1\u023e\3\0\1\u023e\5\0\1\u023e\11\0\1\u023e\11\0"+
+    "\1\u023e\1\0\3\u023e\1\0\2\u023e\14\0\1\u023f\1\0"+
+    "\4\u023f\4\0\1\u023f\2\0\1\u023f\4\0\1\u023f\1\0"+
+    "\1\u023f\5\0\1\u023f\1\0\1\u023f\3\0\1\u023f\5\0"+
+    "\1\u023f\11\0\1\u023f\11\0\1\u023f\1\0\3\u023f\1\0"+
+    "\2\u023f\14\0\13\11\1\u0240\2\11\1\0\1\111\1\0"+
+    "\6\11\3\0\12\11\1\u0240\2\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\1\11\1\u0241"+
+    "\13\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\13\11\1\u0242\1\11\1\0\2\11\1\u0243"+
+    "\2\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\1\u0244\4\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\1\u0245\4\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\2\11\1\u0246\13\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\10\11\1\u0247\5\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\13\11\1\u0248"+
+    "\1\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\4\11\1\u0249\10\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\u024a\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\u024b\11\11\1\u024c\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\6\11"+
+    "\1\u024d\7\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\2\11\1\u024e\12\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\6\11"+
+    "\1\u024f\7\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\13\11\1\u0250\1\11\1\0\2\11\1\u0251\2\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\1\u0252\4\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\1\u0253\4\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\7\11\1\u0254\5\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\6\11\1\u0255\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\1\u0256"+
+    "\115\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u0257\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\136\4\0\5\136"+
+    "\2\0\11\136\1\u0258\4\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\3\136\1\u0259\12\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\4\136\1\u025a\11\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\6\136\1\u025b\7\136"+
+    "\4\0\5\136\2\0\16\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\3\136\1\u025c\12\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\12\136\1\u025d\3\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\7\136\1\u025e\6\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\7\136\1\u025f\6\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\15\136\1\u0260\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\16\136\1\0\1\136\1\u0261\7\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\16\136\1\0\1\136\1\u0262\7\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\10\136\1\u0263\5\136\4\0"+
+    "\5\136\2\0\16\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\14\136\1\u0264\1\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\10\136\1\u0265\1\136\1\u0266\3\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\5\136\1\u0267\1\u0268\7\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\3\136\1\u0269\12\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\7\136\1\u026a\6\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\10\136\1\u026b\5\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\13\136\1\u026c\2\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\15\136\1\u026d\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\u026e\14\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\11\11"+
+    "\1\u026f\3\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\11\1\u0270\13\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\13\11"+
+    "\1\u0271\1\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\u0272\2\11\1\u0273\11\11\1\0"+
+    "\4\11\1\u0274\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\63\0\1\u0275\21\0\1\u0276\2\0\1\u0277"+
+    "\20\0\16\11\1\0\1\111\1\0\6\11\3\0\4\11"+
+    "\1\u0278\10\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\u0279\14\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\13\11\1\u027a"+
+    "\1\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\u027b\14\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u027c\1\11"+
+    "\1\0\2\11\1\u027d\2\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\1\u027e\4\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\1\u027f\4\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\2\11\1\u0280\13\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\10\11"+
+    "\1\u0281\5\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\11\1\u0282\13\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u0283\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\13\11\1\u0284\1\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\4\11\1\u0285\10\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\12\11\1\u0286\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\6\11"+
+    "\1\u0287\7\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\13\11\1\u0288\1\11\1\0\2\11\1\u0289\2\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\1\u028a\4\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\1\u028b\4\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\2\11"+
+    "\1\u028c\13\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u028d\5\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u028e\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\12\11\1\u028f\3\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u0290\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\13\11\1\u0291\1\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u0292\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u0293\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\11\11\1\u0294\3\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u0179\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\6\11"+
+    "\1\u0295\7\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u0296\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\u0297\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\u0298\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\2\11\1\u0299\13\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\10\11\1\u029a\5\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\54\0\1\u029b\152\0\1\u029c"+
+    "\17\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u029d\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\13\11\1\u029e\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\11\11"+
+    "\1\u029f\3\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\4\11\1\u02a0\10\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\3\11"+
+    "\1\u02a1\11\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\7\11\1\u02a2\5\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\1\u02a3\4\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\13\11\1\u02a4\1\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\u02a5"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\1\u02a6\1\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\1\u02a7\2\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\1\11\1\u0286\3\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\6\11\1\u02a8\6\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\6\11\1\u02a9\7\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\u02aa\14\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\111\0\1\u02ab\113\0\1\u02ac\21\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\3\11\1\u015d\11\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\u02ad\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\11\1\u017a\13\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\1\u02ae"+
+    "\1\0\4\u02ae\4\0\1\u02ae\2\0\1\u02ae\4\0\1\u02ae"+
+    "\1\0\1\u02ae\5\0\1\u02ae\1\0\1\u02ae\3\0\1\u02ae"+
+    "\5\0\1\u02ae\11\0\1\u02ae\11\0\1\u02ae\1\0\3\u02ae"+
+    "\1\0\2\u02ae\14\0\14\11\1\301\1\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\2\11\1\301\2\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\6\11\1\u02af\7\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\13\11\1\u02b0\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u02b1\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\2\11\1\u02b2\12\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\13\11"+
+    "\1\u02b3\1\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\1\11\1\u02b4\7\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\14\11"+
+    "\1\u02b5\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\u02b6\13\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\10\11\1\u02b7\5\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\1\u02b8\115\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\6\11\1\u02b9\6\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\10\11\1\u02ba\5\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\2\11\1\u02bb"+
+    "\7\11\1\u01be\3\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\u02bc\1\u01bf\1\11\1\u02bd\10\11\1\u01c0\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\u017a"+
+    "\14\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\10\11\1\u02be\5\11\1\0"+
+    "\1\111\1\0\6\11\3\0\3\11\1\u02bf\1\11\1\u02c0"+
+    "\5\11\1\u02c1\1\u02c2\1\0\5\11\1\0\3\11\4\0"+
+    "\1\u02c3\1\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u02c4\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\12\11\1\u02c5\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\2\11\1\u02c6\12\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\13\11\1\u02c7\1\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\7\11\1\u02c8\5\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\11\11\1\u02c9\3\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\103\0\1\u02ca"+
+    "\25\0\16\11\1\0\1\111\1\0\6\11\3\0\13\11"+
+    "\1\u02cb\1\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\136\4\0\5\136"+
+    "\2\0\7\136\1\u02cc\6\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\2\136\1\u02cd\13\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\15\136\1\u02ce\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\13\136\1\u02cf\2\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\14\136\1\u02d0\1\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\6\136\1\u02d1\7\136\4\0"+
+    "\5\136\2\0\16\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\6\136\1\u02d2\7\136\4\0"+
+    "\5\136\2\0\16\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\5\136\1\u02d3\10\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\5\136\1\u02d4\10\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\7\136\1\u02d5\6\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\1\136\1\u02d6\14\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\10\136\1\u02d7\5\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\12\136\1\u02d8\3\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\2\136\1\u02d9\13\136\4\0"+
+    "\5\136\2\0\16\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\3\136\1\u02da\12\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\1\136\1\u02db\6\136\1\u02dc\5\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\13\136\1\u02dd\2\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\13\136\1\u02de\2\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\7\136\1\u02df\6\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\1\u02e0\4\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\1\11\1\u02e1\3\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\13\11\1\u02e2\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\4\11"+
+    "\1\u02e3\10\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\11\1\u02e4\13\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u02e5\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\10\11\1\u02e6\5\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\23\0\1\u02e7\203\0\1\u02e8\17\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\u02e9\14\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\2\11\1\u02ea"+
+    "\12\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\6\11\1\u02eb\7\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u015d"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\13\11\1\u02ec\1\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u02ed"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\2\11\1\u02ee\12\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\13\11\1\u02ef"+
+    "\1\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\1\11\1\u02f0\7\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\14\11\1\u02ed"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u02f1\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\10\11"+
+    "\1\u02f2\5\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\2\11\1\u0213\12\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\2\11"+
+    "\1\u02f3\13\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\1\u02f4\2\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\3\11\1\u02f5\11\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\13\11\1\u02f6\1\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\12\11\1\u02f7\2\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\2\11\1\u02f8\12\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\13\11\1\u02f9\1\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\1\11\1\u02fa\7\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\14\11\1\u02fb\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\11"+
+    "\1\u02fc\13\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\5\11\1\u015d\7\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\1\u02fd\2\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\11\11\1\u02fe\3\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\u02ff"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\6\11\1\u0300\7\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u0301"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\13\11\1\u0302\1\11\1\0\4\11\1\u0303"+
+    "\1\0\3\11\4\0\1\u0304\1\11\1\0\1\11\1\0"+
+    "\11\11\13\0\6\11\1\u0305\7\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\u0306\14\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\3\11"+
+    "\1\u0307\11\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\1\11\1\u0308\7\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\14\11"+
+    "\1\u0309\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\60\0\1\u030a\50\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\2\11\1\u022a\12\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\1\11\1\u029d\3\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\2\11\1\u030b"+
+    "\13\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\12\11\1\u030c\2\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\2\11\1\u030d\12\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\6\11\1\u030e\7\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\7\11\1\u030f\5\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\11\11\1\u027b\3\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\6\11\1\u0310\6\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\46\0\1\u0311\40\0\1\u0312\21\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\14\11\1\u0313\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u0314\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\6\11\1\u0315\7\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\1\u0316\115\0\12\11\1\u0317\3\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\u0318\7\11\1\u0319\4\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\11\1\u031a\13\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\6\11\1\u031b\6\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\7\11\1\u031b\5\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\7\11\1\u031c\5\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\6\11\1\u031d\6\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\6\11\1\u031e\6\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\2\11\1\u031f\12\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\u0320\14\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\103\0\1\u0321\25\0\6\11\1\u0322\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\2\11\1\u0323\12\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\2\11\1\u0324\2\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\1\u0325"+
+    "\4\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\1\u0326\4\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\11\11\1\u0327\3\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\4\11"+
+    "\1\u0328\5\11\1\u0329\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u032a\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\2\11\1\u032b\13\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\10\11"+
+    "\1\u032c\5\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u032d\5\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\1\11\1\u032e\13\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u032f\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\7\11\1\u032f\5\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u0330\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\2\11\1\u0331\12\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u0332\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\1\u0333"+
+    "\1\0\4\u0333\4\0\1\u0333\2\0\1\u0333\4\0\1\u0333"+
+    "\1\0\1\u0333\5\0\1\u0333\1\0\1\u0333\3\0\1\u0333"+
+    "\5\0\1\u0333\11\0\1\u0333\11\0\1\u0333\1\0\3\u0333"+
+    "\1\0\2\u0333\14\0\6\11\1\u0334\7\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\136"+
+    "\4\0\5\136\2\0\12\136\1\u0335\3\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\2\136\1\u0336\13\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\3\136\1\u0337\12\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\10\136"+
+    "\1\u0338\5\136\4\0\5\136\2\0\16\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\13\136\1\u0339\2\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\4\136\1\u033a\11\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\4\136\1\u033b\11\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\7\136\1\u033c\6\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\7\136\1\u033d\6\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\2\136\1\u033e\13\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\3\136\1\u033f\12\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\3\136\1\u0340\12\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\14\136\1\u0341\1\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\3\136\1\u0342\12\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\10\136\1\u0343\5\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\16\136\1\0\3\136\1\u0344\5\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\3\136\1\u0345\12\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\16\136\1\0\1\u0346\10\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\16\136\1\u0347\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\136\4\0\5\136\2\0"+
+    "\10\136\1\u0348\5\136\1\0\11\136\3\0\3\136\1\0"+
+    "\1\136\1\0\11\136\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\2\11\1\u0349\12\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\2\11\1\u034a"+
+    "\12\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\2\11\1\u034b\13\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\2\11\1\u034c"+
+    "\12\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\7\11\1\u034d\5\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\14\11\1\u034e"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\64\0\1\u034f\44\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\12\11\1\u0350\2\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\3\11"+
+    "\1\u0351\11\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\10\11\1\u01bd\1\11"+
+    "\1\u01be\3\11\1\0\1\111\1\0\6\11\3\0\14\11"+
+    "\1\u01c0\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\u0352\13\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\u02e1"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\7\11\1\u02e1\5\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\7\11\1\u034a"+
+    "\5\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\6\11\1\u0353\6\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\11\11\1\u0354"+
+    "\3\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\13\11\1\u0355\1\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\1\11\1\u0356"+
+    "\13\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\107\0\1\u0312\21\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\4\11\1\u0357"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\11"+
+    "\1\u0358\13\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u0359\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\7\11"+
+    "\1\u0359\5\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\7\11\1\u035a\5\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\u035b\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u035c\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\2\11"+
+    "\1\u035d\12\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\46\0\1\u035e\40\0\1\u0312"+
+    "\21\0\10\11\1\u035f\5\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\14\11\1\u015d\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\10\11\1\u0360\5\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\1\u0361\2\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\2\11"+
+    "\1\u0362\13\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u0363\5\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u0364\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u0365\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\6\11\1\u0366\6\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\4\11\1\u0367\10\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\6\11\1\u0368\6\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u0369\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\55\0\1\u036a"+
+    "\53\0\16\11\1\0\1\111\1\0\6\11\3\0\1\11"+
+    "\1\u036b\13\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\2\11\1\u036c\12\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\2\11\1\u036d\2\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\12\11\1\u036e\3\11"+
+    "\1\0\1\111\1\0\6\11\3\0\1\u036f\7\11\1\u0370"+
+    "\4\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\7\11\1\u0371\5\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\23\0"+
+    "\1\u0372\141\0\1\u0373\61\0\6\11\1\u0374\7\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\13\11\1\u0375"+
+    "\1\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\6\11\1\u0169\6\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\103\0"+
+    "\1\u0376\25\0\10\11\1\u0377\5\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\11\1\u0378\13\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\6\11\1\u0379\6\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\6\11\1\u037a\6\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\6\11\1\u037b\7\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\12\11\1\u031b\2\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\u037c\14\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\6\11\1\u037d\7\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u037e\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\3\11\1\u037f\1\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\1\u0380\1\0\4\u0380\4\0\1\u0380\2\0\1\u0380"+
+    "\4\0\1\u0380\1\0\1\u0380\5\0\1\u0380\1\0\1\u0380"+
+    "\3\0\1\u0380\5\0\1\u0380\11\0\1\u0380\11\0\1\u0380"+
+    "\1\0\3\u0380\1\0\2\u0380\14\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\13\11\1\u0381\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u0382\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\12\11\1\u036b\2\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\2\11"+
+    "\1\u0383\12\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\13\11\1\u0384\1\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u0385\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\5\11\1\u0386\7\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\2\11"+
+    "\1\u0387\12\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\11\1\u0388\13\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\1\11\1\u0389\7\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\7\11\1\u038a\5\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\7\11"+
+    "\1\u038b\5\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u038c\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u032f\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\2\11\1\u038d\2\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\4\11\1\u038e\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\10\11\1\u01bd\5\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\11\1\u01bf\12\11\1\u01c0"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\136\4\0\5\136\2\0\13\136"+
+    "\1\u038f\2\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\13\136"+
+    "\1\u0390\2\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\14\136"+
+    "\1\u0391\1\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\3\136"+
+    "\1\u0392\12\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\16\136"+
+    "\1\0\4\136\1\u0393\4\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\16\136"+
+    "\1\0\4\136\1\u0394\4\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\15\136"+
+    "\1\u0395\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\2\136\1\u0396"+
+    "\13\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\16\136\1\0"+
+    "\2\136\1\u0397\6\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\13\136\1\u0398"+
+    "\2\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\12\136\1\u0399"+
+    "\3\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\4\136\1\u039a"+
+    "\11\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\7\136\1\u039b"+
+    "\6\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\11\136\1\u039c"+
+    "\4\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\14\136\1\u039d"+
+    "\1\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\2\136\1\u039e"+
+    "\13\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\4\136\1\u039f"+
+    "\11\136\1\0\11\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\11\11\1\u03a0\3\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\12\11\1\u02e1\2\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\11\1\u02ed\13\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\3\11\1\u03a1\11\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\10\11\1\u03a2\5\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\6\11\1\u03a3\6\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\63\0\1\u03a4\45\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\13\11\1\u03a5\1\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u03a6"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\6\11\1\u03a7\6\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\1\u034a\14\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\1\11\1\u03a8\3\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\11\11\1\u015d\3\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u0286\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\10\11"+
+    "\1\u03a9\5\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u03aa\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u0359\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\u03ab\14\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\6\11\1\u03ac"+
+    "\7\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\12\11\1\u03ad\2\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\23\0\1\u03ae\105\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\1\11\1\u0292\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\11\11\1\u03af\3\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\46\0\1\u035e"+
+    "\62\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\1\11\1\u03b0\7\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\14\11\1\u03b1\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\10\11\1\u03b2\5\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\11\11\1\u03b3\3\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\u03b4\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\5\11\1\u03b5"+
+    "\7\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\u03b6\13\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\1\u03b7\14\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\1\u01bc\2\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\110\0\1\u03b8\20\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\u029d"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\11\11\1\u03b9\3\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\10\11\1\u03ba\5\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\u03bb\13\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\u03bc"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\10\11\1\u03bd\5\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\57\0"+
+    "\1\u03be\117\0\1\u03bf\47\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\3\11\1\u03c0\11\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\6\11\1\u03c1\7\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\1\u03c2\1\0\4\u03c2\4\0"+
+    "\1\u03c2\2\0\1\u03c2\4\0\1\u03c2\1\0\1\u03c2\5\0"+
+    "\1\u03c2\1\0\1\u03c2\3\0\1\u03c2\5\0\1\u03c2\11\0"+
+    "\1\u03c2\11\0\1\u03c2\1\0\3\u03c2\1\0\2\u03c2\14\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\u03c3"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\2\11\1\u03c4\12\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u03c5"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\2\11\1\u03c6\12\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\5\11\1\u01db\3\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\12\11\1\u031e\2\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\1\u01da\1\11\1\0\1\11"+
+    "\1\0\5\11\1\u01db\3\11\13\0\10\11\1\u03c7\5\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\12\11\1\u036d\3\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\10\11\1\u03c8\5\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\7\11"+
+    "\1\u029d\5\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\7\11\1\u022a\5\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\u03c9\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u03ca\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u03cb\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\2\11\1\u03cc\2\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\u03cd\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u03ce\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u03cf\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\2\11\1\u03d0\12\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\6\11\1\u03d1\7\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\6\11\1\u03d2\7\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\136\4\0\5\136\2\0\4\136\1\u03d3\11\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\3\136\1\u03d4\12\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\12\136\1\u03d5\3\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\13\136\1\u03d6\2\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\10\136\1\u03d7\5\136\4\0\5\136\2\0\16\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\10\136\1\u03d8\5\136\4\0\5\136\2\0\16\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\6\136\1\u03d9\7\136\4\0\5\136\2\0\16\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\3\136\1\u03da\12\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\12\136\1\u03db\3\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\7\136\1\u03dc\6\136"+
+    "\1\0\11\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\13\0\16\136\4\0\5\136\2\0\15\136\1\u03dd\1\0"+
+    "\11\136\3\0\3\136\1\0\1\136\1\0\11\136\13\0"+
+    "\16\136\4\0\5\136\2\0\15\136\1\u03de\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\14\136\1\u03df\1\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\1\11"+
+    "\1\u03e0\3\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\3\11\1\u03a6\11\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\11\11\1\u03e1\3\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\1\u03e2\2\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\110\0\1\u03e3\20\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\7\11\1\u015d"+
+    "\5\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\2\11\1\u03e4\12\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u03e5"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\12\11\1\u03e6\2\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\2\11\1\u03e7"+
+    "\12\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\12\11\1\u035c\2\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\1\u021a\1\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u03e8\5\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\57\0\1\u03e9"+
+    "\51\0\16\11\1\0\1\111\1\0\6\11\3\0\1\11"+
+    "\1\u03ea\13\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u03eb\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\u03ec\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\14\11\1\u03ed\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u03ee"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\10\11\1\u03ef\5\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u03f0"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\12\11\1\u03f1\2\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\12\11\1\u0369"+
+    "\2\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\111\0\1\u03f2\17\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\u03f3\14\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\u03f4\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\2\11\1\u03f5\12\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u03f6\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\12\11\1\u03f7\3\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\110\0\1\u03f8\2\0\1\u03f9\63\0\1\u03fa\47\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\2\11"+
+    "\1\u03fb\2\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u01bd\1\11\1\u01be\3\11"+
+    "\1\0\1\111\1\0\6\11\3\0\1\11\1\u01bf\13\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\11\1\u03fc\13\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\3\11\1\u03fd\11\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\1\u03fe\4\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\11\11\1\u031b\3\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\11\1\u03ff\13\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\13\11\1\u0400\1\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\7\11\1\u0401\5\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\7\11\1\u0402\5\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\10\11\1\u0403\5\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\10\11\1\u0404\4\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\u0405\14\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\u0406\14\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\4\11\1\u0407"+
+    "\10\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\11\11\1\u032f\3\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\14\11\1\u0408"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\2\11\1\u0409\12\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\10\136"+
+    "\1\u040a\5\136\4\0\5\136\2\0\16\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\13\136\1\u040b\2\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\13\136\1\u040c\2\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\15\136\1\u040d\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\13\136\1\u040e\2\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\14\136\1\u040f\1\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\6\136\1\u0410"+
+    "\7\136\4\0\5\136\2\0\16\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\6\136\1\u0411"+
+    "\7\136\4\0\5\136\2\0\16\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\1\136\1\u0412\14\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\6\11\1\u02aa\6\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\1\11\1\u0413\3\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\63\0\1\u0414\24\0"+
+    "\1\u0277\3\0\1\u0415\112\0\1\u0416\17\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\11\11\1\u02e1\3\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\1\u029d\4\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\1\u0417\14\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\11\11\1\u0359"+
+    "\3\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\11\1\u0418\13\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\113\0"+
+    "\1\u03f9\15\0\10\11\1\u0419\5\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\u03ef\14\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\6\11\1\u041a\7\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u041b\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u03ec\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\10\11\1\u041c\5\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\6\11\1\u041d\7\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u03a6\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\11"+
+    "\1\u041e\13\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\3\11\1\u041f\11\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\1\u0420\4\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\10\11\1\u0421\5\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\111\0"+
+    "\1\u0422\60\0\1\u0423\54\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\11\11\1\u0424\3\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\14\11\1\u0425"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\3\11\1\u0425\11\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u03fc\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\6\11\1\u0426\6\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\11\11\1\u02aa\3\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\12\11\1\u0427\3\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\6\11"+
+    "\1\u0428\7\11\1\0\1\111\1\0\6\11\1\u0429\2\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\1\u042a\14\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u042b\1\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\12\11\1\u042c\2\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u042d\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\2\11\1\u042e\12\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\2\11\1\u042f\12\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u0430\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\136"+
+    "\4\0\5\136\2\0\14\136\1\u0431\1\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\1\136\1\u0432\14\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\1\136\1\u0433\14\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\3\136\1\u0434\12\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\10\136"+
+    "\1\u0435\5\136\4\0\5\136\2\0\16\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\13\136\1\u0436\2\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\4\136\1\u0437\11\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\4\136\1\u0438\11\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\3\136\1\u0439\12\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\1\u043a\2\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\23\0\1\u043b\201\0\1\u043c\21\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\1\u043d\4\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\u043e\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\11\11\1\u043f\3\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\2\11\1\u0440\13\11\1\0\1\111\1\0\6\11"+
+    "\3\0\11\11\1\u0441\3\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\7\11\1\u03ec\5\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\13\11\1\u0442\1\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\13\11\1\u0302\1\11"+
+    "\1\0\4\11\1\u0303\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\14\11\1\u030f\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\3\11\1\u030f\11\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\13\11\1\u041e\1\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\1\u0443\14\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\u0158\14\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\6\11\1\u0444\7\11"+
+    "\1\0\1\111\1\0\6\11\3\0\15\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\2\11"+
+    "\1\u0445\12\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\5\11\1\u0446\3\11"+
+    "\54\0\1\u0447\54\0\16\11\1\0\1\111\1\0\6\11"+
+    "\1\u0429\2\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\7\11\1\u0448\5\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\6\11\1\u0449\7\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\6\11\1\u044a"+
+    "\7\11\1\0\1\111\1\0\6\11\1\u0429\2\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\1\11\1\u0402\13\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\12\11\1\u044b\2\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u044c\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\136"+
+    "\4\0\5\136\2\0\12\136\1\u044d\3\136\1\0\11\136"+
+    "\3\0\3\136\1\0\1\136\1\0\11\136\13\0\16\136"+
+    "\4\0\5\136\2\0\16\136\1\0\1\u044e\10\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\16\136\1\0\1\u044f\10\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\13\136\1\u0450\2\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\14\136\1\u0451\1\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\3\136\1\u0452\12\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\16\136\1\0\4\136\1\u0453\4\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\16\136\1\0\4\136\1\u0454\4\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\2\136\1\u0455\13\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\106\0\1\u0456\73\0\1\u0457"+
+    "\44\0\16\11\1\0\1\111\1\0\6\11\3\0\6\11"+
+    "\1\u0458\6\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\2\11\1\u0459\12\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\13\11"+
+    "\1\u045a\1\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\11\11\1\u03ec\3\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\2\11"+
+    "\1\u045b\12\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\2\11\1\u045c\12\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\u045d"+
+    "\14\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\4\11\1\u045e\10\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\47\0"+
+    "\1\u045f\61\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\5\11\1\u0460\7\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\10\11\1\u0461"+
+    "\5\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\6\11\1\u0462\6\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\2\11\1\u043d\12\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\2\11\1\u0463\12\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\136\4\0"+
+    "\5\136\2\0\3\136\1\u0464\12\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\12\136\1\u0465\3\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\13\136\1\u0466\2\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\10\136\1\u0467"+
+    "\5\136\4\0\5\136\2\0\16\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\10\136\1\u0468"+
+    "\5\136\4\0\5\136\2\0\16\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\51\0\1\u0469\127\0"+
+    "\1\u046a\45\0\16\11\1\0\1\111\1\0\6\11\1\u046b"+
+    "\2\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\7\11\1\u046c\5\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\6\11\1\u046d\7\11\1\0\1\111\1\0\6\11"+
+    "\3\0\15\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\12\11\1\u046e\2\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\1\u046f"+
+    "\14\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\6\11\1\u042a\6\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\10\11\1\u0470\5\11\1\0\1\111\1\0\6\11\3\0"+
+    "\15\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\56\0\1\u0471\52\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\1\u0472\4\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\11\11"+
+    "\1\u0473\3\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\10\11\1\u0474\4\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\2\11\1\u0475\2\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\10\136\1\u0476\5\136"+
+    "\4\0\5\136\2\0\16\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\13\136\1\u0477\2\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\13\0\16\136\4\0\5\136"+
+    "\2\0\13\136\1\u0478\2\136\1\0\11\136\3\0\3\136"+
+    "\1\0\1\136\1\0\11\136\55\0\1\u0479\150\0\1\u047a"+
+    "\61\0\1\u047b\54\0\16\11\1\0\1\111\1\0\6\11"+
+    "\3\0\7\11\1\u047c\5\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\2\11"+
+    "\1\u0440\13\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u047d\5\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\1\u047e\14\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\1\u047f\14\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\64\0\1\u0480\44\0\10\11"+
+    "\1\u0481\5\11\1\0\1\111\1\0\6\11\3\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\10\11\1\u0482\5\11\1\0\1\111"+
+    "\1\0\6\11\3\0\15\11\1\0\5\11\1\0\3\11"+
+    "\4\0\2\11\1\0\1\11\1\0\11\11\13\0\16\11"+
+    "\1\0\1\111\1\0\6\11\3\0\5\11\1\u0483\7\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\1\u0484\2\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\136\4\0"+
+    "\5\136\2\0\14\136\1\u0485\1\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\1\136\1\u0486\14\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\13\0\16\136\4\0"+
+    "\5\136\2\0\1\136\1\u0487\14\136\1\0\11\136\3\0"+
+    "\3\136\1\0\1\136\1\0\11\136\15\0\1\u0488\211\0"+
+    "\1\u0489\53\0\1\u048a\61\0\10\11\1\u048b\5\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\13\11\1\u048c"+
+    "\1\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\13\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\6\11\1\u03f5\6\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\15\11\1\0"+
+    "\3\11\1\u048d\1\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\53\0\1\u048e\55\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\1\u048f\14\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\12\11"+
+    "\1\u0490\2\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\12\11\1\u0491\2\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\54\0\1\u0492\54\0\16\136\4\0\5\136\2\0\12\136"+
+    "\1\u0493\3\136\1\0\11\136\3\0\3\136\1\0\1\136"+
+    "\1\0\11\136\13\0\16\136\4\0\5\136\2\0\16\136"+
+    "\1\0\1\u0494\10\136\3\0\3\136\1\0\1\136\1\0"+
+    "\11\136\13\0\16\136\4\0\5\136\2\0\16\136\1\0"+
+    "\1\u0495\10\136\3\0\3\136\1\0\1\136\1\0\11\136"+
+    "\60\0\1\u0496\113\0\1\u0497\52\0\16\11\1\0\1\111"+
+    "\1\0\6\11\3\0\6\11\1\u0498\6\11\1\0\5\11"+
+    "\1\0\3\11\4\0\2\11\1\0\1\11\1\0\11\11"+
+    "\13\0\16\11\1\0\1\111\1\0\6\11\3\0\11\11"+
+    "\1\u0499\3\11\1\0\5\11\1\0\3\11\4\0\2\11"+
+    "\1\0\1\11\1\0\11\11\13\0\16\11\1\0\1\111"+
+    "\1\0\6\11\1\u049a\2\0\15\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\13\0"+
+    "\16\11\1\0\1\111\1\0\6\11\1\u049b\2\0\15\11"+
+    "\1\0\5\11\1\0\3\11\4\0\2\11\1\0\1\11"+
+    "\1\0\11\11\13\0\16\11\1\0\1\111\1\0\6\11"+
+    "\1\u049c\2\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\13\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\15\11\1\0\2\11\1\u049d"+
+    "\2\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\47\0\1\u049e\132\0\1\u049f\44\0\16\11\1\0"+
+    "\1\111\1\0\6\11\3\0\7\11\1\u04a0\5\11\1\0"+
+    "\5\11\1\0\3\11\4\0\2\11\1\0\1\11\1\0"+
+    "\11\11\13\0\6\11\1\u04a1\7\11\1\0\1\111\1\0"+
+    "\6\11\3\0\15\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\54\0\1\u04a2\115\0"+
+    "\1\u04a3\115\0\1\u04a4\117\0\1\u04a5\112\0\1\u04a6\55\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\6\11\1\u04a7"+
+    "\6\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\47\0\1\u04a8\115\0\1\u04a9\115\0"+
+    "\1\u04aa\132\0\1\u04ab\44\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\7\11\1\u04ac\5\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\56\0"+
+    "\1\u04ad\115\0\1\u04ae\115\0\1\u04af\112\0\1\u04b0\55\0"+
+    "\16\11\1\0\1\111\1\0\6\11\3\0\7\11\1\u04b1"+
+    "\5\11\1\0\5\11\1\0\3\11\4\0\2\11\1\0"+
+    "\1\11\1\0\11\11\64\0\1\u04b2\115\0\1\u04b3\115\0"+
+    "\1\u04b4\44\0\16\11\1\0\1\111\1\0\6\11\3\0"+
+    "\13\11\1\u04b5\1\11\1\0\5\11\1\0\3\11\4\0"+
+    "\2\11\1\0\1\11\1\0\11\11\53\0\1\u04b6\115\0"+
+    "\1\u04b7\115\0\1\u04b8\55\0\16\11\1\0\1\111\1\0"+
+    "\6\11\3\0\7\11\1\u04b9\5\11\1\0\5\11\1\0"+
+    "\3\11\4\0\2\11\1\0\1\11\1\0\11\11\12\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[85020];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unknown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\6\0\1\11\35\1\2\11\5\1\12\11\2\1\1\11"+
+    "\2\1\2\11\1\0\1\1\2\11\1\0\7\1\1\0"+
+    "\10\1\1\0\1\11\15\1\1\11\12\1\1\0\1\1"+
+    "\2\0\54\1\6\0\3\11\1\1\6\11\2\1\1\0"+
+    "\2\1\1\0\2\11\45\1\1\0\1\1\2\0\1\1"+
+    "\2\0\60\1\1\11\1\0\1\11\1\0\1\11\2\1"+
+    "\1\0\1\1\1\0\50\1\4\0\124\1\1\0\41\1"+
+    "\1\0\17\1\1\0\31\1\1\0\36\1\1\0\42\1"+
+    "\2\0\17\1\2\0\3\1\1\11\13\1\1\0\13\1"+
+    "\1\0\36\1\1\0\1\11\1\0\43\1\1\0\1\11"+
+    "\12\1\1\0\3\1\2\11\1\0\12\1\1\0\21\1"+
+    "\1\0\34\1\1\0\1\11\13\1\1\0\10\1\1\0"+
+    "\14\1\1\0\6\1\2\0\3\1\1\0\12\1\1\0"+
+    "\45\1\1\0\7\1\1\0\16\1\1\0\2\1\1\0"+
+    "\10\1\1\0\7\1\2\0\2\1\1\0\55\1\1\0"+
+    "\11\1\1\0\11\1\1\0\5\1\2\0\42\1\2\0"+
+    "\5\1\1\0\10\1\1\11\5\1\1\0\1\11\1\0"+
+    "\31\1\2\0\1\11\13\1\2\11\5\1\1\0\20\1"+
+    "\2\0\1\11\12\1\1\0\16\1\2\0\7\1\1\0"+
+    "\11\1\3\0\5\1\1\0\7\1\3\0\4\1\1\0"+
+    "\3\1\1\0\3\1\1\0\1\11\1\0\3\1\1\11"+
+    "\3\1\1\0\3\1\1\11\1\0\2\1\3\0\1\1"+
+    "\2\0\2\1\4\0\1\11\1\1\4\0\1\1\3\0"+
+    "\1\11\1\1\3\0\1\1\3\11\1\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[1209];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** number of newlines encountered up to the start of the matched text */
+  private int yyline;
+
+  /** the number of characters up to the start of the matched text */
+  private int yychar;
+
+  /**
+   * the number of characters from the last newline up to the start of the
+   * matched text
+   */
+  private int yycolumn;
+
+  /**
+   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+   */
+  private boolean zzAtBOL = true;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /** denotes if the user-EOF-code has already been executed */
+  private boolean zzEOFDone;
+
+  /**
+   * The number of occupied positions in zzBuffer beyond zzEndRead.
+   * When a lead/high surrogate has been read from the input stream
+   * into the final zzBuffer position, this will have a value of 1;
+   * otherwise, it will have a value of 0.
+   */
+  private int zzFinalHighSurrogate = 0;
+
+  /* user code: */
+    private StringBuffer sb = new StringBuffer();
+    private String stringOrCharError = null;
+    private int stringStartLine;
+    private int stringStartCol;
+    private int stringStartChar;
+
+    private int lexerErrors = 0;
+
+    private File sourceFile;
+
+    private boolean suppressErrors;
+
+    public Token nextToken() {
+        try {
+            Token token = yylex();
+            if (token instanceof InvalidToken) {
+                InvalidToken invalidToken = (InvalidToken)token;
+                if (!suppressErrors) {
+                    System.err.println(getErrorHeader(invalidToken) + " Error for input '" +
+                        invalidToken.getText() + "': " + invalidToken.getMessage());
+                }
+                lexerErrors++;
+            }
+            return token;
+        }
+        catch (java.io.IOException e) {
+            System.err.println("shouldn't happen: " + e.getMessage());
+            return newToken(EOF);
+        }
+    }
+
+    public void setLine(int line) {
+        this.yyline = line-1;
+    }
+
+    public void setColumn(int column) {
+        this.yycolumn = column;
+    }
+
+    public int getLine() {
+        return this.yyline+1;
+    }
+
+    public int getColumn() {
+        return this.yycolumn;
+    }
+
+    public void setSuppressErrors(boolean suppressErrors) {
+        this.suppressErrors = suppressErrors;
+    }
+
+    public void setSourceFile(File sourceFile) {
+        this.sourceFile = sourceFile;
+    }
+
+    public String getSourceName() {
+        if (sourceFile == null) {
+            return "";
+        }
+        try {
+            return  PathUtil.getRelativeFile(new File("."), sourceFile).getPath();
+        } catch (IOException ex) {
+            return sourceFile.getAbsolutePath();
+        }
+    }
+
+    public int getNumberOfSyntaxErrors() {
+        return lexerErrors;
+    }
+
+    private Token newToken(int type, String text, boolean hidden) {
+        CommonToken token = new CommonToken(type, text);
+        if (hidden) {
+            token.setChannel(Token.HIDDEN_CHANNEL);
+        }
+
+        token.setStartIndex(yychar);
+        token.setStopIndex(yychar + yylength() - 1);
+        token.setLine(getLine());
+        token.setCharPositionInLine(getColumn());
+        return token;
+    }
+
+    private Token newToken(int type, String text) {
+        return newToken(type, text, false);
+    }
+
+    private Token newToken(int type, boolean hidden) {
+        return newToken(type, yytext(), hidden);
+    }
+
+    private Token newToken(int type) {
+        return newToken(type, yytext(), false);
+    }
+
+    private Token invalidToken(String message, String text) {
+        InvalidToken token = new InvalidToken(message, text);
+
+        token.setStartIndex(yychar);
+        token.setStopIndex(yychar + yylength() - 1);
+        token.setLine(getLine());
+        token.setCharPositionInLine(getColumn());
+
+        return token;
+    }
+
+    private Token invalidToken(String message) {
+        return invalidToken(message, yytext());
+    }
+
+    private void beginStringOrChar(int state) {
+        yybegin(state);
+        sb.setLength(0);
+        stringStartLine = getLine();
+        stringStartCol = getColumn();
+        stringStartChar = yychar;
+        stringOrCharError = null;
+    }
+
+    private Token endStringOrChar(int type) {
+        yybegin(YYINITIAL);
+
+        if (stringOrCharError != null) {
+            return invalidStringOrChar(stringOrCharError);
+        }
+
+        CommonToken token = new CommonToken(type, sb.toString());
+        token.setStartIndex(stringStartChar);
+        token.setStopIndex(yychar + yylength() - 1);
+        token.setLine(stringStartLine);
+        token.setCharPositionInLine(stringStartCol);
+        return token;
+    }
+
+    private void setStringOrCharError(String message) {
+        if (stringOrCharError == null) {
+            stringOrCharError = message;
+        }
+    }
+
+    private Token invalidStringOrChar(String message) {
+        yybegin(YYINITIAL);
+
+        InvalidToken token = new InvalidToken(message, sb.toString());
+        token.setStartIndex(stringStartChar);
+        token.setStopIndex(yychar + yylength() - 1);
+        token.setLine(stringStartLine);
+        token.setCharPositionInLine(stringStartCol);
+        return token;
+    }
+
+    public String getErrorHeader(InvalidToken token) {
+        return getSourceName()+"["+ token.getLine()+","+token.getCharPositionInLine()+"]";
+    }
+
+    public void reset(CharSequence charSequence, int start, int end, int initialState) {
+        zzReader = BlankReader.INSTANCE;
+        zzBuffer = new char[charSequence.length()];
+        for (int i=0; i<charSequence.length(); i++) {
+            zzBuffer[i] = charSequence.charAt(i);
+        }
+
+        yychar = zzCurrentPos = zzMarkedPos = zzStartRead = start;
+        zzEndRead = end;
+        zzAtBOL = true;
+        zzAtEOF = false;
+        yybegin(initialState);
+    }
+
+
+  /**
+   * Creates a new scanner
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public smaliFlexLexer(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+
+  /**
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x110000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 240) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Refills the input buffer.
+   *
+   * @return      <code>false</code>, iff there was new input.
+   *
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  private boolean zzRefill() throws java.io.IOException {
+
+    /* first: make room (if you can) */
+    if (zzStartRead > 0) {
+      zzEndRead += zzFinalHighSurrogate;
+      zzFinalHighSurrogate = 0;
+      System.arraycopy(zzBuffer, zzStartRead,
+                       zzBuffer, 0,
+                       zzEndRead-zzStartRead);
+
+      /* translate stored positions */
+      zzEndRead-= zzStartRead;
+      zzCurrentPos-= zzStartRead;
+      zzMarkedPos-= zzStartRead;
+      zzStartRead = 0;
+    }
+
+    /* is the buffer big enough? */
+    if (zzCurrentPos >= zzBuffer.length - zzFinalHighSurrogate) {
+      /* if not: blow it up */
+      char newBuffer[] = new char[zzBuffer.length*2];
+      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
+      zzBuffer = newBuffer;
+      zzEndRead += zzFinalHighSurrogate;
+      zzFinalHighSurrogate = 0;
+    }
+
+    /* fill the buffer with new input */
+    int requested = zzBuffer.length - zzEndRead;
+    int numRead = zzReader.read(zzBuffer, zzEndRead, requested);
+
+    /* not supposed to occur according to specification of java.io.Reader */
+    if (numRead == 0) {
+      throw new java.io.IOException("Reader returned 0 characters. See JFlex examples for workaround.");
+    }
+    if (numRead > 0) {
+      zzEndRead += numRead;
+      /* If numRead == requested, we might have requested to few chars to
+         encode a full Unicode character. We assume that a Reader would
+         otherwise never return half characters. */
+      if (numRead == requested) {
+        if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1])) {
+          --zzEndRead;
+          zzFinalHighSurrogate = 1;
+        }
+      }
+      /* potentially more input available */
+      return false;
+    }
+
+    /* numRead < 0 ==> end of stream */
+    return true;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Resets the scanner to read from a new input stream.
+   * Does not close the old reader.
+   *
+   * All internal variables are reset, the old input stream
+   * <b>cannot</b> be reused (internal buffer is discarded and lost).
+   * Lexical state is set to <tt>ZZ_INITIAL</tt>.
+   *
+   * Internal scan buffer is resized down to its initial length, if it has grown.
+   *
+   * @param reader   the new input stream
+   */
+  public final void yyreset(java.io.Reader reader) {
+    zzReader = reader;
+    zzAtBOL  = true;
+    zzAtEOF  = false;
+    zzEOFDone = false;
+    zzEndRead = zzStartRead = 0;
+    zzCurrentPos = zzMarkedPos = 0;
+    zzFinalHighSurrogate = 0;
+    yyline = yychar = yycolumn = 0;
+    zzLexicalState = YYINITIAL;
+    if (zzBuffer.length > ZZ_BUFFERSIZE)
+      zzBuffer = new char[ZZ_BUFFERSIZE];
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the
+   * matched text.
+   *
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch.
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of
+   * yypushback(int) and a match-all fallback rule) this method
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  }
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      yychar+= zzMarkedPosL-zzStartRead;
+
+      boolean zzR = false;
+      int zzCh;
+      int zzCharCount;
+      for (zzCurrentPosL = zzStartRead  ;
+           zzCurrentPosL < zzMarkedPosL ;
+           zzCurrentPosL += zzCharCount ) {
+        zzCh = Character.codePointAt(zzBufferL, zzCurrentPosL, zzMarkedPosL);
+        zzCharCount = Character.charCount(zzCh);
+        switch (zzCh) {
+        case '\u000B':
+        case '\u000C':
+        case '\u0085':
+        case '\u2028':
+        case '\u2029':
+          yyline++;
+          yycolumn = 0;
+          zzR = false;
+          break;
+        case '\r':
+          yyline++;
+          yycolumn = 0;
+          zzR = true;
+          break;
+        case '\n':
+          if (zzR)
+            zzR = false;
+          else {
+            yyline++;
+            yycolumn = 0;
+          }
+          break;
+        default:
+          zzR = false;
+          yycolumn += zzCharCount;
+        }
+      }
+
+      if (zzR) {
+        // peek one character ahead if it is \n (if we have counted one line too much)
+        boolean zzPeek;
+        if (zzMarkedPosL < zzEndReadL)
+          zzPeek = zzBufferL[zzMarkedPosL] == '\n';
+        else if (zzAtEOF)
+          zzPeek = false;
+        else {
+          boolean eof = zzRefill();
+          zzEndReadL = zzEndRead;
+          zzMarkedPosL = zzMarkedPos;
+          zzBufferL = zzBuffer;
+          if (eof)
+            zzPeek = false;
+          else
+            zzPeek = zzBufferL[zzMarkedPosL] == '\n';
+        }
+        if (zzPeek) yyline--;
+      }
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+      zzState = ZZ_LEXSTATE[zzLexicalState];
+
+      // set up zzAction for empty match case:
+      int zzAttributes = zzAttrL[zzState];
+      if ( (zzAttributes & 1) == 1 ) {
+        zzAction = zzState;
+      }
+
+
+      zzForAction: {
+        while (true) {
+
+          if (zzCurrentPosL < zzEndReadL) {
+            zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL);
+            zzCurrentPosL += Character.charCount(zzInput);
+          }
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL);
+              zzCurrentPosL += Character.charCount(zzInput);
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+        zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              return newToken(EOF);
+            }
+            case 1210: break;
+            case PARAM_LIST_OR_ID: {
+              yybegin(YYINITIAL);
+            }
+            case 1211: break;
+            case PARAM_LIST: {
+              yybegin(YYINITIAL);
+            }
+            case 1212: break;
+            case ARRAY_DESCRIPTOR: {
+              yybegin(YYINITIAL);
+            }
+            case 1213: break;
+            case STRING: {
+              return invalidStringOrChar("Unterminated string literal");
+            }
+            case 1214: break;
+            case CHAR: {
+              return invalidStringOrChar("Unterminated character literal");
+            }
+            case 1215: break;
+            default:
+        return null;
+        }
+      }
+      else {
+        switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+          case 1:
+            { return invalidToken("Invalid text");
+            }
+          case 141: break;
+          case 2:
+            { return newToken(POSITIVE_INTEGER_LITERAL);
+            }
+          case 142: break;
+          case 3:
+            { return newToken(SIMPLE_NAME);
+            }
+          case 143: break;
+          case 4:
+            { return invalidToken("Invalid directive");
+            }
+          case 144: break;
+          case 5:
+            { return newToken(PRIMITIVE_TYPE);
+            }
+          case 145: break;
+          case 6:
+            { yybegin(ARRAY_DESCRIPTOR);
+      return newToken(ARRAY_TYPE_PREFIX);
+            }
+          case 146: break;
+          case 7:
+            { return newToken(WHITE_SPACE, true);
+            }
+          case 147: break;
+          case 8:
+            { beginStringOrChar(STRING); sb.append('"');
+            }
+          case 148: break;
+          case 9:
+            { beginStringOrChar(CHAR); sb.append('\'');
+            }
+          case 149: break;
+          case 10:
+            { return newToken(LINE_COMMENT, true);
+            }
+          case 150: break;
+          case 11:
+            { return newToken(VOID_TYPE);
+            }
+          case 151: break;
+          case 12:
+            { return newToken(EQUAL);
+            }
+          case 152: break;
+          case 13:
+            { return newToken(COLON);
+            }
+          case 153: break;
+          case 14:
+            { return newToken(COMMA);
+            }
+          case 154: break;
+          case 15:
+            { return newToken(OPEN_BRACE);
+            }
+          case 155: break;
+          case 16:
+            { return newToken(CLOSE_BRACE);
+            }
+          case 156: break;
+          case 17:
+            { return newToken(OPEN_PAREN);
+            }
+          case 157: break;
+          case 18:
+            { return newToken(CLOSE_PAREN);
+            }
+          case 158: break;
+          case 19:
+            { yypushback(1); yybegin(YYINITIAL);
+            }
+          case 159: break;
+          case 20:
+            { return newToken(PARAM_LIST_OR_ID_PRIMITIVE_TYPE);
+            }
+          case 160: break;
+          case 21:
+            { return newToken(ARRAY_TYPE_PREFIX);
+            }
+          case 161: break;
+          case 22:
+            { yybegin(YYINITIAL); return newToken(PRIMITIVE_TYPE);
+            }
+          case 162: break;
+          case 23:
+            { sb.append(yytext());
+            }
+          case 163: break;
+          case 24:
+            { sb.append('"'); return endStringOrChar(STRING_LITERAL);
+            }
+          case 164: break;
+          case 25:
+            { return invalidStringOrChar("Unterminated string literal");
+            }
+          case 165: break;
+          case 26:
+            { sb.append('\'');
+        if (sb.length() == 2) {
+            return invalidStringOrChar("Empty character literal");
+        } else if (sb.length() > 3) {
+            return invalidStringOrChar("Character literal with multiple chars");
+        }
+
+        return endStringOrChar(CHAR_LITERAL);
+            }
+          case 166: break;
+          case 27:
+            { return invalidStringOrChar("Unterminated character literal");
+            }
+          case 167: break;
+          case 28:
+            { return newToken(FLOAT_LITERAL_OR_ID);
+            }
+          case 168: break;
+          case 29:
+            { return newToken(BYTE_LITERAL);
+            }
+          case 169: break;
+          case 30:
+            { return newToken(DOUBLE_LITERAL);
+            }
+          case 170: break;
+          case 31:
+            { return newToken(LONG_LITERAL);
+            }
+          case 171: break;
+          case 32:
+            { return newToken(SHORT_LITERAL);
+            }
+          case 172: break;
+          case 33:
+            { return newToken(DOUBLE_LITERAL_OR_ID);
+            }
+          case 173: break;
+          case 34:
+            { return newToken(NEGATIVE_INTEGER_LITERAL);
+            }
+          case 174: break;
+          case 35:
+            { return newToken(ARROW);
+            }
+          case 175: break;
+          case 36:
+            { return newToken(DOTDOT);
+            }
+          case 176: break;
+          case 37:
+            { // go back and re-lex it as a PARAM_LIST_OR_ID
+        yypushback(yylength());
+        yybegin(PARAM_LIST_OR_ID);
+            }
+          case 177: break;
+          case 38:
+            { return newToken(REGISTER);
+            }
+          case 178: break;
+          case 39:
+            { sb.append(yytext());
+        setStringOrCharError("Invalid escape sequence " + yytext());
+            }
+          case 179: break;
+          case 40:
+            { sb.append('\b');
+            }
+          case 180: break;
+          case 41:
+            { sb.append('\f');
+            }
+          case 181: break;
+          case 42:
+            { sb.append(yytext());
+        setStringOrCharError("Invalid \\u sequence. \\u must be followed by 4 hex digits");
+            }
+          case 182: break;
+          case 43:
+            { sb.append('\r');
+            }
+          case 183: break;
+          case 44:
+            { sb.append('\n');
+            }
+          case 184: break;
+          case 45:
+            { sb.append('\t');
+            }
+          case 185: break;
+          case 46:
+            { sb.append('"');
+            }
+          case 186: break;
+          case 47:
+            { sb.append('\'');
+            }
+          case 187: break;
+          case 48:
+            { sb.append('\\');
+            }
+          case 188: break;
+          case 49:
+            { sb.append(yytext());
+        setStringOrCharError("Invalid \\u sequence. \\u must be followed by exactly 4 hex digits");
+            }
+          case 189: break;
+          case 50:
+            { return newToken(FLOAT_LITERAL);
+            }
+          case 190: break;
+          case 51:
+            { // go back and re-lex it as a PARAM_LIST
+        yypushback(yylength());
+        yybegin(PARAM_LIST);
+            }
+          case 191: break;
+          case 52:
+            { return newToken(CLASS_DESCRIPTOR);
+            }
+          case 192: break;
+          case 53:
+            { return newToken(INSTRUCTION_FORMAT10x);
+            }
+          case 193: break;
+          case 54:
+            { return newToken(MEMBER_NAME);
+            }
+          case 194: break;
+          case 55:
+            { yybegin(YYINITIAL); return newToken(CLASS_DESCRIPTOR);
+            }
+          case 195: break;
+          case 56:
+            { return newToken(INSTRUCTION_FORMAT22c_FIELD);
+            }
+          case 196: break;
+          case 57:
+            { return newToken(INSTRUCTION_FORMAT23x);
+            }
+          case 197: break;
+          case 58:
+            { return newToken(INSTRUCTION_FORMAT21c_FIELD);
+            }
+          case 198: break;
+          case 59:
+            { return newToken(ACCESS_SPEC);
+            }
+          case 199: break;
+          case 60:
+            { return newToken(INSTRUCTION_FORMAT12x_OR_ID);
+            }
+          case 200: break;
+          case 61:
+            { return newToken(NULL_LITERAL);
+            }
+          case 201: break;
+          case 62:
+            { return newToken(BOOL_LITERAL);
+            }
+          case 202: break;
+          case 63:
+            { return newToken(INSTRUCTION_FORMAT10t);
+            }
+          case 203: break;
+          case 64:
+            { return newToken(ANNOTATION_VISIBILITY);
+            }
+          case 204: break;
+          case 65:
+            { return newToken(INSTRUCTION_FORMAT22t);
+            }
+          case 205: break;
+          case 66:
+            { return newToken(LINE_DIRECTIVE);
+            }
+          case 206: break;
+          case 67:
+            { return newToken(ENUM_DIRECTIVE);
+            }
+          case 207: break;
+          case 68:
+            { return newToken(INSTRUCTION_FORMAT31i_OR_ID);
+            }
+          case 208: break;
+          case 69:
+            { return newToken(INSTRUCTION_FORMAT11x);
+            }
+          case 209: break;
+          case 70:
+            { return newToken(INSTRUCTION_FORMAT21t);
+            }
+          case 210: break;
+          case 71:
+            { return newToken(FIELD_DIRECTIVE);
+            }
+          case 211: break;
+          case 72:
+            { return newToken(CLASS_DIRECTIVE);
+            }
+          case 212: break;
+          case 73:
+            { return newToken(CATCH_DIRECTIVE);
+            }
+          case 213: break;
+          case 74:
+            { return newToken(LOCAL_DIRECTIVE);
+            }
+          case 214: break;
+          case 75:
+            { return newToken(SUPER_DIRECTIVE);
+            }
+          case 215: break;
+          case 76:
+            { return newToken(PARAMETER_DIRECTIVE);
+            }
+          case 216: break;
+          case 77:
+            { sb.append((char)Integer.parseInt(yytext().substring(2,6), 16));
+            }
+          case 217: break;
+          case 78:
+            { return newToken(LOCALS_DIRECTIVE);
+            }
+          case 218: break;
+          case 79:
+            { return newToken(SOURCE_DIRECTIVE);
+            }
+          case 219: break;
+          case 80:
+            { return newToken(METHOD_DIRECTIVE);
+            }
+          case 220: break;
+          case 81:
+            { return newToken(INSTRUCTION_FORMAT11n);
+            }
+          case 221: break;
+          case 82:
+            { return newToken(INSTRUCTION_FORMAT32x);
+            }
+          case 222: break;
+          case 83:
+            { return newToken(INSTRUCTION_FORMAT20t);
+            }
+          case 223: break;
+          case 84:
+            { return newToken(INSTRUCTION_FORMAT30t);
+            }
+          case 224: break;
+          case 85:
+            { return newToken(INSTRUCTION_FORMAT21s);
+            }
+          case 225: break;
+          case 86:
+            { return newToken(INSTRUCTION_FORMAT22s_OR_ID);
+            }
+          case 226: break;
+          case 87:
+            { return newToken(VERIFICATION_ERROR_TYPE);
+            }
+          case 227: break;
+          case 88:
+            { return newToken(FIELD_OFFSET);
+            }
+          case 228: break;
+          case 89:
+            { return newToken(CATCHALL_DIRECTIVE);
+            }
+          case 229: break;
+          case 90:
+            { return newToken(PROLOGUE_DIRECTIVE);
+            }
+          case 230: break;
+          case 91:
+            { return newToken(EPILOGUE_DIRECTIVE);
+            }
+          case 231: break;
+          case 92:
+            { return newToken(INSTRUCTION_FORMAT22c_TYPE);
+            }
+          case 232: break;
+          case 93:
+            { return newToken(INSTRUCTION_FORMAT22cs_FIELD);
+            }
+          case 233: break;
+          case 94:
+            { return newToken(INLINE_INDEX);
+            }
+          case 234: break;
+          case 95:
+            { return newToken(END_FIELD_DIRECTIVE);
+            }
+          case 235: break;
+          case 96:
+            { return newToken(END_LOCAL_DIRECTIVE);
+            }
+          case 236: break;
+          case 97:
+            { return newToken(END_PARAMETER_DIRECTIVE);
+            }
+          case 237: break;
+          case 98:
+            { return newToken(REGISTERS_DIRECTIVE);
+            }
+          case 238: break;
+          case 99:
+            { return newToken(INSTRUCTION_FORMAT51l);
+            }
+          case 239: break;
+          case 100:
+            { return newToken(INSTRUCTION_FORMAT21c_TYPE);
+            }
+          case 240: break;
+          case 101:
+            { return newToken(VTABLE_INDEX);
+            }
+          case 241: break;
+          case 102:
+            { return newToken(IMPLEMENTS_DIRECTIVE);
+            }
+          case 242: break;
+          case 103:
+            { return newToken(ARRAY_DATA_DIRECTIVE);
+            }
+          case 243: break;
+          case 104:
+            { return newToken(ANNOTATION_DIRECTIVE);
+            }
+          case 244: break;
+          case 105:
+            { return newToken(END_METHOD_DIRECTIVE);
+            }
+          case 245: break;
+          case 106:
+            { return newToken(INSTRUCTION_FORMAT22x);
+            }
+          case 246: break;
+          case 107:
+            { return newToken(INSTRUCTION_FORMAT22b);
+            }
+          case 247: break;
+          case 108:
+            { return newToken(INSTRUCTION_FORMAT35c_METHOD);
+            }
+          case 248: break;
+          case 109:
+            { return newToken(INSTRUCTION_FORMAT21c_STRING);
+            }
+          case 249: break;
+          case 110:
+            { return newToken(INSTRUCTION_FORMAT21ih);
+            }
+          case 250: break;
+          case 111:
+            { return newToken(INSTRUCTION_FORMAT22s);
+            }
+          case 251: break;
+          case 112:
+            { return newToken(INSTRUCTION_FORMAT12x);
+            }
+          case 252: break;
+          case 113:
+            { return newToken(INSTRUCTION_FORMAT22c_FIELD_ODEX);
+            }
+          case 253: break;
+          case 114:
+            { return newToken(INSTRUCTION_FORMAT31i);
+            }
+          case 254: break;
+          case 115:
+            { return newToken(INSTRUCTION_FORMAT31t);
+            }
+          case 255: break;
+          case 116:
+            { return newToken(INSTRUCTION_FORMAT21c_FIELD_ODEX);
+            }
+          case 256: break;
+          case 117:
+            { return newToken(SUBANNOTATION_DIRECTIVE);
+            }
+          case 257: break;
+          case 118:
+            { return newToken(SPARSE_SWITCH_DIRECTIVE);
+            }
+          case 258: break;
+          case 119:
+            { return newToken(PACKED_SWITCH_DIRECTIVE);
+            }
+          case 259: break;
+          case 120:
+            { return newToken(RESTART_LOCAL_DIRECTIVE);
+            }
+          case 260: break;
+          case 121:
+            { return newToken(INSTRUCTION_FORMAT35mi_METHOD);
+            }
+          case 261: break;
+          case 122:
+            { return newToken(END_ARRAY_DATA_DIRECTIVE);
+            }
+          case 262: break;
+          case 123:
+            { return newToken(END_ANNOTATION_DIRECTIVE);
+            }
+          case 263: break;
+          case 124:
+            { return newToken(INSTRUCTION_FORMAT35c_TYPE);
+            }
+          case 264: break;
+          case 125:
+            { return newToken(INSTRUCTION_FORMAT21lh);
+            }
+          case 265: break;
+          case 126:
+            { return newToken(INSTRUCTION_FORMAT35ms_METHOD);
+            }
+          case 266: break;
+          case 127:
+            { return newToken(INSTRUCTION_FORMAT3rc_METHOD);
+            }
+          case 267: break;
+          case 128:
+            { return newToken(INSTRUCTION_FORMAT45cc_METHOD);
+            }
+          case 268: break;
+          case 129:
+            { return newToken(END_SUBANNOTATION_DIRECTIVE);
+            }
+          case 269: break;
+          case 130:
+            { return newToken(END_SPARSE_SWITCH_DIRECTIVE);
+            }
+          case 270: break;
+          case 131:
+            { return newToken(END_PACKED_SWITCH_DIRECTIVE);
+            }
+          case 271: break;
+          case 132:
+            { return newToken(INSTRUCTION_FORMAT31c);
+            }
+          case 272: break;
+          case 133:
+            { return newToken(INSTRUCTION_FORMAT35c_METHOD_ODEX);
+            }
+          case 273: break;
+          case 134:
+            { return newToken(INSTRUCTION_FORMAT10x_ODEX);
+            }
+          case 274: break;
+          case 135:
+            { return newToken(INSTRUCTION_FORMAT3rmi_METHOD);
+            }
+          case 275: break;
+          case 136:
+            { return newToken(INSTRUCTION_FORMAT3rc_TYPE);
+            }
+          case 276: break;
+          case 137:
+            { return newToken(INSTRUCTION_FORMAT3rms_METHOD);
+            }
+          case 277: break;
+          case 138:
+            { return newToken(INSTRUCTION_FORMAT4rcc_METHOD);
+            }
+          case 278: break;
+          case 139:
+            { return newToken(INSTRUCTION_FORMAT3rc_METHOD_ODEX);
+            }
+          case 279: break;
+          case 140:
+            { return newToken(INSTRUCTION_FORMAT20bc);
+            }
+          case 280: break;
+          default:
+            zzScanError(ZZ_NO_MATCH);
+        }
+      }
+    }
+  }
+
+
+}
diff --git a/smali/src/main/java/org/jf/smali/smaliParser.java b/smali/src/main/java/org/jf/smali/smaliParser.java
new file mode 100644
index 0000000..72ef034
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/smaliParser.java
@@ -0,0 +1,15692 @@
+// $ANTLR 3.5.2 smaliParser.g 2017-04-20 15:20:45
+
+package org.jf.smali;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.Opcodes;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+import org.antlr.runtime.tree.*;
+
+
+@SuppressWarnings("all")
+public class smaliParser extends Parser {
+	public static final String[] tokenNames = new String[] {
+		"<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE", 
+		"ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX", 
+		"ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE", 
+		"CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE", 
+		"CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID", 
+		"END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE", 
+		"END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE", 
+		"END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE", 
+		"ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET", 
+		"FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX", 
+		"INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX", 
+		"INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x", 
+		"INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t", 
+		"INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING", 
+		"INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh", 
+		"INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b", 
+		"INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE", 
+		"INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID", 
+		"INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x", 
+		"INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i", 
+		"INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x", 
+		"INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE", 
+		"INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD", 
+		"INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD", 
+		"INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD", 
+		"INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST", 
+		"I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS", 
+		"I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF", 
+		"I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD", 
+		"I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE", 
+		"I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS", 
+		"I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE", 
+		"I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY", 
+		"I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE", 
+		"I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL", 
+		"I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t", 
+		"I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x", 
+		"I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t", 
+		"I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE", 
+		"I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s", 
+		"I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD", 
+		"I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t", 
+		"I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t", 
+		"I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t", 
+		"I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE", 
+		"I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD", 
+		"I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH", 
+		"I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT", 
+		"LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL", 
+		"MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL", 
+		"OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE", 
+		"PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE", 
+		"PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE", 
+		"SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE", 
+		"STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE", 
+		"VOID_TYPE", "VTABLE_INDEX", "WHITE_SPACE"
+	};
+	public static final int EOF=-1;
+	public static final int ACCESS_SPEC=4;
+	public static final int ANNOTATION_DIRECTIVE=5;
+	public static final int ANNOTATION_VISIBILITY=6;
+	public static final int ARRAY_DATA_DIRECTIVE=7;
+	public static final int ARRAY_TYPE_PREFIX=8;
+	public static final int ARROW=9;
+	public static final int BOOL_LITERAL=10;
+	public static final int BYTE_LITERAL=11;
+	public static final int CATCHALL_DIRECTIVE=12;
+	public static final int CATCH_DIRECTIVE=13;
+	public static final int CHAR_LITERAL=14;
+	public static final int CLASS_DESCRIPTOR=15;
+	public static final int CLASS_DIRECTIVE=16;
+	public static final int CLOSE_BRACE=17;
+	public static final int CLOSE_PAREN=18;
+	public static final int COLON=19;
+	public static final int COMMA=20;
+	public static final int DOTDOT=21;
+	public static final int DOUBLE_LITERAL=22;
+	public static final int DOUBLE_LITERAL_OR_ID=23;
+	public static final int END_ANNOTATION_DIRECTIVE=24;
+	public static final int END_ARRAY_DATA_DIRECTIVE=25;
+	public static final int END_FIELD_DIRECTIVE=26;
+	public static final int END_LOCAL_DIRECTIVE=27;
+	public static final int END_METHOD_DIRECTIVE=28;
+	public static final int END_PACKED_SWITCH_DIRECTIVE=29;
+	public static final int END_PARAMETER_DIRECTIVE=30;
+	public static final int END_SPARSE_SWITCH_DIRECTIVE=31;
+	public static final int END_SUBANNOTATION_DIRECTIVE=32;
+	public static final int ENUM_DIRECTIVE=33;
+	public static final int EPILOGUE_DIRECTIVE=34;
+	public static final int EQUAL=35;
+	public static final int FIELD_DIRECTIVE=36;
+	public static final int FIELD_OFFSET=37;
+	public static final int FLOAT_LITERAL=38;
+	public static final int FLOAT_LITERAL_OR_ID=39;
+	public static final int IMPLEMENTS_DIRECTIVE=40;
+	public static final int INLINE_INDEX=41;
+	public static final int INSTRUCTION_FORMAT10t=42;
+	public static final int INSTRUCTION_FORMAT10x=43;
+	public static final int INSTRUCTION_FORMAT10x_ODEX=44;
+	public static final int INSTRUCTION_FORMAT11n=45;
+	public static final int INSTRUCTION_FORMAT11x=46;
+	public static final int INSTRUCTION_FORMAT12x=47;
+	public static final int INSTRUCTION_FORMAT12x_OR_ID=48;
+	public static final int INSTRUCTION_FORMAT20bc=49;
+	public static final int INSTRUCTION_FORMAT20t=50;
+	public static final int INSTRUCTION_FORMAT21c_FIELD=51;
+	public static final int INSTRUCTION_FORMAT21c_FIELD_ODEX=52;
+	public static final int INSTRUCTION_FORMAT21c_STRING=53;
+	public static final int INSTRUCTION_FORMAT21c_TYPE=54;
+	public static final int INSTRUCTION_FORMAT21ih=55;
+	public static final int INSTRUCTION_FORMAT21lh=56;
+	public static final int INSTRUCTION_FORMAT21s=57;
+	public static final int INSTRUCTION_FORMAT21t=58;
+	public static final int INSTRUCTION_FORMAT22b=59;
+	public static final int INSTRUCTION_FORMAT22c_FIELD=60;
+	public static final int INSTRUCTION_FORMAT22c_FIELD_ODEX=61;
+	public static final int INSTRUCTION_FORMAT22c_TYPE=62;
+	public static final int INSTRUCTION_FORMAT22cs_FIELD=63;
+	public static final int INSTRUCTION_FORMAT22s=64;
+	public static final int INSTRUCTION_FORMAT22s_OR_ID=65;
+	public static final int INSTRUCTION_FORMAT22t=66;
+	public static final int INSTRUCTION_FORMAT22x=67;
+	public static final int INSTRUCTION_FORMAT23x=68;
+	public static final int INSTRUCTION_FORMAT30t=69;
+	public static final int INSTRUCTION_FORMAT31c=70;
+	public static final int INSTRUCTION_FORMAT31i=71;
+	public static final int INSTRUCTION_FORMAT31i_OR_ID=72;
+	public static final int INSTRUCTION_FORMAT31t=73;
+	public static final int INSTRUCTION_FORMAT32x=74;
+	public static final int INSTRUCTION_FORMAT35c_METHOD=75;
+	public static final int INSTRUCTION_FORMAT35c_METHOD_ODEX=76;
+	public static final int INSTRUCTION_FORMAT35c_TYPE=77;
+	public static final int INSTRUCTION_FORMAT35mi_METHOD=78;
+	public static final int INSTRUCTION_FORMAT35ms_METHOD=79;
+	public static final int INSTRUCTION_FORMAT3rc_METHOD=80;
+	public static final int INSTRUCTION_FORMAT3rc_METHOD_ODEX=81;
+	public static final int INSTRUCTION_FORMAT3rc_TYPE=82;
+	public static final int INSTRUCTION_FORMAT3rmi_METHOD=83;
+	public static final int INSTRUCTION_FORMAT3rms_METHOD=84;
+	public static final int INSTRUCTION_FORMAT45cc_METHOD=85;
+	public static final int INSTRUCTION_FORMAT4rcc_METHOD=86;
+	public static final int INSTRUCTION_FORMAT51l=87;
+	public static final int INTEGER_LITERAL=88;
+	public static final int INVALID_TOKEN=89;
+	public static final int I_ACCESS_LIST=90;
+	public static final int I_ANNOTATION=91;
+	public static final int I_ANNOTATIONS=92;
+	public static final int I_ANNOTATION_ELEMENT=93;
+	public static final int I_ARRAY_ELEMENTS=94;
+	public static final int I_ARRAY_ELEMENT_SIZE=95;
+	public static final int I_CATCH=96;
+	public static final int I_CATCHALL=97;
+	public static final int I_CATCHES=98;
+	public static final int I_CLASS_DEF=99;
+	public static final int I_ENCODED_ARRAY=100;
+	public static final int I_ENCODED_ENUM=101;
+	public static final int I_ENCODED_FIELD=102;
+	public static final int I_ENCODED_METHOD=103;
+	public static final int I_END_LOCAL=104;
+	public static final int I_EPILOGUE=105;
+	public static final int I_FIELD=106;
+	public static final int I_FIELDS=107;
+	public static final int I_FIELD_INITIAL_VALUE=108;
+	public static final int I_FIELD_TYPE=109;
+	public static final int I_IMPLEMENTS=110;
+	public static final int I_LABEL=111;
+	public static final int I_LINE=112;
+	public static final int I_LOCAL=113;
+	public static final int I_LOCALS=114;
+	public static final int I_METHOD=115;
+	public static final int I_METHODS=116;
+	public static final int I_METHOD_PROTOTYPE=117;
+	public static final int I_METHOD_RETURN_TYPE=118;
+	public static final int I_ORDERED_METHOD_ITEMS=119;
+	public static final int I_PACKED_SWITCH_ELEMENTS=120;
+	public static final int I_PACKED_SWITCH_START_KEY=121;
+	public static final int I_PARAMETER=122;
+	public static final int I_PARAMETERS=123;
+	public static final int I_PARAMETER_NOT_SPECIFIED=124;
+	public static final int I_PROLOGUE=125;
+	public static final int I_REGISTERS=126;
+	public static final int I_REGISTER_LIST=127;
+	public static final int I_REGISTER_RANGE=128;
+	public static final int I_RESTART_LOCAL=129;
+	public static final int I_SOURCE=130;
+	public static final int I_SPARSE_SWITCH_ELEMENTS=131;
+	public static final int I_STATEMENT_ARRAY_DATA=132;
+	public static final int I_STATEMENT_FORMAT10t=133;
+	public static final int I_STATEMENT_FORMAT10x=134;
+	public static final int I_STATEMENT_FORMAT11n=135;
+	public static final int I_STATEMENT_FORMAT11x=136;
+	public static final int I_STATEMENT_FORMAT12x=137;
+	public static final int I_STATEMENT_FORMAT20bc=138;
+	public static final int I_STATEMENT_FORMAT20t=139;
+	public static final int I_STATEMENT_FORMAT21c_FIELD=140;
+	public static final int I_STATEMENT_FORMAT21c_STRING=141;
+	public static final int I_STATEMENT_FORMAT21c_TYPE=142;
+	public static final int I_STATEMENT_FORMAT21ih=143;
+	public static final int I_STATEMENT_FORMAT21lh=144;
+	public static final int I_STATEMENT_FORMAT21s=145;
+	public static final int I_STATEMENT_FORMAT21t=146;
+	public static final int I_STATEMENT_FORMAT22b=147;
+	public static final int I_STATEMENT_FORMAT22c_FIELD=148;
+	public static final int I_STATEMENT_FORMAT22c_TYPE=149;
+	public static final int I_STATEMENT_FORMAT22s=150;
+	public static final int I_STATEMENT_FORMAT22t=151;
+	public static final int I_STATEMENT_FORMAT22x=152;
+	public static final int I_STATEMENT_FORMAT23x=153;
+	public static final int I_STATEMENT_FORMAT30t=154;
+	public static final int I_STATEMENT_FORMAT31c=155;
+	public static final int I_STATEMENT_FORMAT31i=156;
+	public static final int I_STATEMENT_FORMAT31t=157;
+	public static final int I_STATEMENT_FORMAT32x=158;
+	public static final int I_STATEMENT_FORMAT35c_METHOD=159;
+	public static final int I_STATEMENT_FORMAT35c_TYPE=160;
+	public static final int I_STATEMENT_FORMAT3rc_METHOD=161;
+	public static final int I_STATEMENT_FORMAT3rc_TYPE=162;
+	public static final int I_STATEMENT_FORMAT45cc_METHOD=163;
+	public static final int I_STATEMENT_FORMAT4rcc_METHOD=164;
+	public static final int I_STATEMENT_FORMAT51l=165;
+	public static final int I_STATEMENT_PACKED_SWITCH=166;
+	public static final int I_STATEMENT_SPARSE_SWITCH=167;
+	public static final int I_SUBANNOTATION=168;
+	public static final int I_SUPER=169;
+	public static final int LINE_COMMENT=170;
+	public static final int LINE_DIRECTIVE=171;
+	public static final int LOCALS_DIRECTIVE=172;
+	public static final int LOCAL_DIRECTIVE=173;
+	public static final int LONG_LITERAL=174;
+	public static final int MEMBER_NAME=175;
+	public static final int METHOD_DIRECTIVE=176;
+	public static final int NEGATIVE_INTEGER_LITERAL=177;
+	public static final int NULL_LITERAL=178;
+	public static final int OPEN_BRACE=179;
+	public static final int OPEN_PAREN=180;
+	public static final int PACKED_SWITCH_DIRECTIVE=181;
+	public static final int PARAMETER_DIRECTIVE=182;
+	public static final int PARAM_LIST_OR_ID_PRIMITIVE_TYPE=183;
+	public static final int POSITIVE_INTEGER_LITERAL=184;
+	public static final int PRIMITIVE_TYPE=185;
+	public static final int PROLOGUE_DIRECTIVE=186;
+	public static final int REGISTER=187;
+	public static final int REGISTERS_DIRECTIVE=188;
+	public static final int RESTART_LOCAL_DIRECTIVE=189;
+	public static final int SHORT_LITERAL=190;
+	public static final int SIMPLE_NAME=191;
+	public static final int SOURCE_DIRECTIVE=192;
+	public static final int SPARSE_SWITCH_DIRECTIVE=193;
+	public static final int STRING_LITERAL=194;
+	public static final int SUBANNOTATION_DIRECTIVE=195;
+	public static final int SUPER_DIRECTIVE=196;
+	public static final int VERIFICATION_ERROR_TYPE=197;
+	public static final int VOID_TYPE=198;
+	public static final int VTABLE_INDEX=199;
+	public static final int WHITE_SPACE=200;
+
+	// delegates
+	public Parser[] getDelegates() {
+		return new Parser[] {};
+	}
+
+	// delegators
+
+
+	public smaliParser(TokenStream input) {
+		this(input, new RecognizerSharedState());
+	}
+	public smaliParser(TokenStream input, RecognizerSharedState state) {
+		super(input, state);
+	}
+
+	protected TreeAdaptor adaptor = new CommonTreeAdaptor();
+
+	public void setTreeAdaptor(TreeAdaptor adaptor) {
+		this.adaptor = adaptor;
+	}
+	public TreeAdaptor getTreeAdaptor() {
+		return adaptor;
+	}
+	@Override public String[] getTokenNames() { return smaliParser.tokenNames; }
+	@Override public String getGrammarFileName() { return "smaliParser.g"; }
+
+
+	  public static final int ERROR_CHANNEL = 100;
+
+	  private boolean verboseErrors = false;
+	  private boolean allowOdex = false;
+	  private int apiLevel = 15;
+	  private Opcodes opcodes = Opcodes.forApi(apiLevel);
+
+	  public void setVerboseErrors(boolean verboseErrors) {
+	    this.verboseErrors = verboseErrors;
+	  }
+
+	  public void setAllowOdex(boolean allowOdex) {
+	      this.allowOdex = allowOdex;
+	  }
+
+	  public void setApiLevel(int apiLevel) {
+	      this.opcodes = Opcodes.forApi(apiLevel);
+	      this.apiLevel = apiLevel;
+	  }
+
+	  public String getErrorMessage(RecognitionException e,
+	    String[] tokenNames) {
+
+	    if (verboseErrors) {
+	      List stack = getRuleInvocationStack(e, this.getClass().getName());
+	      String msg = null;
+
+	      if (e instanceof NoViableAltException) {
+	        NoViableAltException nvae = (NoViableAltException)e;
+	        msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+
+	        " (decision="+nvae.decisionNumber+
+	        " state "+nvae.stateNumber+")"+
+	        " decision=<<"+nvae.grammarDecisionDescription+">>";
+	      } else {
+	        msg = super.getErrorMessage(e, tokenNames);
+	      }
+
+	      return stack + " " + msg;
+	    } else {
+	      return super.getErrorMessage(e, tokenNames);
+	    }
+	  }
+
+	  public String getTokenErrorDisplay(Token t) {
+	    if (!verboseErrors) {
+	      String s = t.getText();
+	      if ( s==null ) {
+	        if ( t.getType()==Token.EOF ) {
+	          s = "<EOF>";
+	        }
+	        else {
+	          s = "<"+tokenNames[t.getType()]+">";
+	        }
+	      }
+	      s = s.replaceAll("\n","\\\\n");
+	      s = s.replaceAll("\r","\\\\r");
+	      s = s.replaceAll("\t","\\\\t");
+	      return "'"+s+"'";
+	    }
+
+	    CommonToken ct = (CommonToken)t;
+
+	    String channelStr = "";
+	    if (t.getChannel()>0) {
+	      channelStr=",channel="+t.getChannel();
+	    }
+	    String txt = t.getText();
+	    if ( txt!=null ) {
+	      txt = txt.replaceAll("\n","\\\\n");
+	      txt = txt.replaceAll("\r","\\\\r");
+	      txt = txt.replaceAll("\t","\\\\t");
+	    }
+	    else {
+	      txt = "<no text>";
+	    }
+	    return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]";
+	  }
+
+	  public String getErrorHeader(RecognitionException e) {
+	    return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]";
+	  }
+
+	  private CommonTree buildTree(int type, String text, List<CommonTree> children) {
+	    CommonTree root = new CommonTree(new CommonToken(type, text));
+	    for (CommonTree child: children) {
+	      root.addChild(child);
+	    }
+	    return root;
+	  }
+
+	  private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) {
+	    CommonToken token = new CommonToken(baseToken);
+	    token.setStartIndex(baseToken.getStartIndex() + typeStartIndex);
+
+	    switch (str.charAt(typeStartIndex)) {
+	      case 'Z':
+	      case 'B':
+	      case 'S':
+	      case 'C':
+	      case 'I':
+	      case 'J':
+	      case 'F':
+	      case 'D':
+	      {
+	        token.setType(PRIMITIVE_TYPE);
+	        token.setText(str.substring(typeStartIndex, typeStartIndex+1));
+	        token.setStopIndex(baseToken.getStartIndex() + typeStartIndex);
+	        break;
+	      }
+	      case 'L':
+	      {
+	        int i = typeStartIndex;
+	        while (str.charAt(++i) != ';');
+
+	        token.setType(CLASS_DESCRIPTOR);
+	        token.setText(str.substring(typeStartIndex, i + 1));
+	        token.setStopIndex(baseToken.getStartIndex() + i);
+	        break;
+	      }
+	      case '[':
+	      {
+	        int i = typeStartIndex;
+	        while (str.charAt(++i) == '[');
+
+	        token.setType(ARRAY_TYPE_PREFIX);
+	        token.setText(str.substring(typeStartIndex, i));
+	        token.setStopIndex(baseToken.getStartIndex() + i - 1);
+	        break;
+	      }
+	      default:
+	        throw new RuntimeException(String.format("Invalid character '%c' in param list \"%s\" at position %d", str.charAt(typeStartIndex), str, typeStartIndex));
+	    }
+
+	    return token;
+	  }
+
+	  private CommonTree parseParamList(CommonToken paramListToken) {
+	    String paramList = paramListToken.getText();
+	    CommonTree root = new CommonTree();
+
+	    int startIndex = paramListToken.getStartIndex();
+
+	    int i=0;
+	    while (i<paramList.length()) {
+	      CommonToken token = getParamListSubToken(paramListToken, paramList, i);
+	      root.addChild(new CommonTree(token));
+	      i += token.getText().length();
+	    }
+
+	    if (root.getChildCount() == 0) {
+	      return null;
+	    }
+	    return root;
+	  }
+
+	  private void throwOdexedInstructionException(IntStream input, String odexedInstruction)
+	      throws OdexedInstructionException {
+	    /*this has to be done in a separate method, otherwise java will complain about the
+	    auto-generated code in the rule after the throw not being reachable*/
+	    throw new OdexedInstructionException(input, odexedInstruction);
+	  }
+
+
+	protected static class smali_file_scope {
+		boolean hasClassSpec;
+		boolean hasSuperSpec;
+		boolean hasSourceSpec;
+		List<CommonTree> classAnnotations;
+	}
+	protected Stack<smali_file_scope> smali_file_stack = new Stack<smali_file_scope>();
+
+	public static class smali_file_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "smali_file"
+	// smaliParser.g:415:1: smali_file : ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) ;
+	public final smaliParser.smali_file_return smali_file() throws RecognitionException {
+		smali_file_stack.push(new smali_file_scope());
+		smaliParser.smali_file_return retval = new smaliParser.smali_file_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token EOF8=null;
+		ParserRuleReturnScope class_spec1 =null;
+		ParserRuleReturnScope super_spec2 =null;
+		ParserRuleReturnScope implements_spec3 =null;
+		ParserRuleReturnScope source_spec4 =null;
+		ParserRuleReturnScope method5 =null;
+		ParserRuleReturnScope field6 =null;
+		ParserRuleReturnScope annotation7 =null;
+
+		CommonTree EOF8_tree=null;
+		RewriteRuleTokenStream stream_EOF=new RewriteRuleTokenStream(adaptor,"token EOF");
+		RewriteRuleSubtreeStream stream_class_spec=new RewriteRuleSubtreeStream(adaptor,"rule class_spec");
+		RewriteRuleSubtreeStream stream_annotation=new RewriteRuleSubtreeStream(adaptor,"rule annotation");
+		RewriteRuleSubtreeStream stream_method=new RewriteRuleSubtreeStream(adaptor,"rule method");
+		RewriteRuleSubtreeStream stream_field=new RewriteRuleSubtreeStream(adaptor,"rule field");
+		RewriteRuleSubtreeStream stream_super_spec=new RewriteRuleSubtreeStream(adaptor,"rule super_spec");
+		RewriteRuleSubtreeStream stream_implements_spec=new RewriteRuleSubtreeStream(adaptor,"rule implements_spec");
+		RewriteRuleSubtreeStream stream_source_spec=new RewriteRuleSubtreeStream(adaptor,"rule source_spec");
+
+		 smali_file_stack.peek().hasClassSpec = smali_file_stack.peek().hasSuperSpec = smali_file_stack.peek().hasSourceSpec = false;
+		    smali_file_stack.peek().classAnnotations = new ArrayList<CommonTree>();
+		  
+		try {
+			// smaliParser.g:427:3: ( ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) )
+			// smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF
+			{
+			// smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+
+			int cnt1=0;
+			loop1:
+			while (true) {
+				int alt1=8;
+				int LA1_0 = input.LA(1);
+				if ( (LA1_0==CLASS_DIRECTIVE) && ((!smali_file_stack.peek().hasClassSpec))) {
+					alt1=1;
+				}
+				else if ( (LA1_0==SUPER_DIRECTIVE) && ((!smali_file_stack.peek().hasSuperSpec))) {
+					alt1=2;
+				}
+				else if ( (LA1_0==IMPLEMENTS_DIRECTIVE) ) {
+					alt1=3;
+				}
+				else if ( (LA1_0==SOURCE_DIRECTIVE) && ((!smali_file_stack.peek().hasSourceSpec))) {
+					alt1=4;
+				}
+				else if ( (LA1_0==METHOD_DIRECTIVE) ) {
+					alt1=5;
+				}
+				else if ( (LA1_0==FIELD_DIRECTIVE) ) {
+					alt1=6;
+				}
+				else if ( (LA1_0==ANNOTATION_DIRECTIVE) ) {
+					alt1=7;
+				}
+
+				switch (alt1) {
+				case 1 :
+					// smaliParser.g:428:5: {...}? => class_spec
+					{
+					if ( !((!smali_file_stack.peek().hasClassSpec)) ) {
+						throw new FailedPredicateException(input, "smali_file", "!$smali_file::hasClassSpec");
+					}
+					pushFollow(FOLLOW_class_spec_in_smali_file1075);
+					class_spec1=class_spec();
+					state._fsp--;
+
+					stream_class_spec.add(class_spec1.getTree());
+					smali_file_stack.peek().hasClassSpec = true;
+					}
+					break;
+				case 2 :
+					// smaliParser.g:429:5: {...}? => super_spec
+					{
+					if ( !((!smali_file_stack.peek().hasSuperSpec)) ) {
+						throw new FailedPredicateException(input, "smali_file", "!$smali_file::hasSuperSpec");
+					}
+					pushFollow(FOLLOW_super_spec_in_smali_file1086);
+					super_spec2=super_spec();
+					state._fsp--;
+
+					stream_super_spec.add(super_spec2.getTree());
+					smali_file_stack.peek().hasSuperSpec = true;
+					}
+					break;
+				case 3 :
+					// smaliParser.g:430:5: implements_spec
+					{
+					pushFollow(FOLLOW_implements_spec_in_smali_file1094);
+					implements_spec3=implements_spec();
+					state._fsp--;
+
+					stream_implements_spec.add(implements_spec3.getTree());
+					}
+					break;
+				case 4 :
+					// smaliParser.g:431:5: {...}? => source_spec
+					{
+					if ( !((!smali_file_stack.peek().hasSourceSpec)) ) {
+						throw new FailedPredicateException(input, "smali_file", "!$smali_file::hasSourceSpec");
+					}
+					pushFollow(FOLLOW_source_spec_in_smali_file1103);
+					source_spec4=source_spec();
+					state._fsp--;
+
+					stream_source_spec.add(source_spec4.getTree());
+					smali_file_stack.peek().hasSourceSpec = true;
+					}
+					break;
+				case 5 :
+					// smaliParser.g:432:5: method
+					{
+					pushFollow(FOLLOW_method_in_smali_file1111);
+					method5=method();
+					state._fsp--;
+
+					stream_method.add(method5.getTree());
+					}
+					break;
+				case 6 :
+					// smaliParser.g:433:5: field
+					{
+					pushFollow(FOLLOW_field_in_smali_file1117);
+					field6=field();
+					state._fsp--;
+
+					stream_field.add(field6.getTree());
+					}
+					break;
+				case 7 :
+					// smaliParser.g:434:5: annotation
+					{
+					pushFollow(FOLLOW_annotation_in_smali_file1123);
+					annotation7=annotation();
+					state._fsp--;
+
+					stream_annotation.add(annotation7.getTree());
+					smali_file_stack.peek().classAnnotations.add((annotation7!=null?((CommonTree)annotation7.getTree()):null));
+					}
+					break;
+
+				default :
+					if ( cnt1 >= 1 ) break loop1;
+					EarlyExitException eee = new EarlyExitException(1, input);
+					throw eee;
+				}
+				cnt1++;
+			}
+
+			EOF8=(Token)match(input,EOF,FOLLOW_EOF_in_smali_file1134);  
+			stream_EOF.add(EOF8);
+
+
+			    if (!smali_file_stack.peek().hasClassSpec) {
+			      throw new SemanticException(input, "The file must contain a .class directive");
+			    }
+
+			    if (!smali_file_stack.peek().hasSuperSpec) {
+			      if (!(class_spec1!=null?((smaliParser.class_spec_return)class_spec1).className:null).equals("Ljava/lang/Object;")) {
+			        throw new SemanticException(input, "The file must contain a .super directive");
+			      }
+			    }
+			  
+			// AST REWRITE
+			// elements: super_spec, method, field, implements_spec, class_spec, source_spec
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 448:3: -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) )
+			{
+				// smaliParser.g:448:6: ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CLASS_DEF, "I_CLASS_DEF"), root_1);
+				adaptor.addChild(root_1, stream_class_spec.nextTree());
+				// smaliParser.g:450:8: ( super_spec )?
+				if ( stream_super_spec.hasNext() ) {
+					adaptor.addChild(root_1, stream_super_spec.nextTree());
+				}
+				stream_super_spec.reset();
+
+				// smaliParser.g:451:8: ( implements_spec )*
+				while ( stream_implements_spec.hasNext() ) {
+					adaptor.addChild(root_1, stream_implements_spec.nextTree());
+				}
+				stream_implements_spec.reset();
+
+				// smaliParser.g:452:8: ( source_spec )?
+				if ( stream_source_spec.hasNext() ) {
+					adaptor.addChild(root_1, stream_source_spec.nextTree());
+				}
+				stream_source_spec.reset();
+
+				// smaliParser.g:453:8: ^( I_METHODS ( method )* )
+				{
+				CommonTree root_2 = (CommonTree)adaptor.nil();
+				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHODS, "I_METHODS"), root_2);
+				// smaliParser.g:453:20: ( method )*
+				while ( stream_method.hasNext() ) {
+					adaptor.addChild(root_2, stream_method.nextTree());
+				}
+				stream_method.reset();
+
+				adaptor.addChild(root_1, root_2);
+				}
+
+				// smaliParser.g:453:29: ^( I_FIELDS ( field )* )
+				{
+				CommonTree root_2 = (CommonTree)adaptor.nil();
+				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELDS, "I_FIELDS"), root_2);
+				// smaliParser.g:453:40: ( field )*
+				while ( stream_field.hasNext() ) {
+					adaptor.addChild(root_2, stream_field.nextTree());
+				}
+				stream_field.reset();
+
+				adaptor.addChild(root_1, root_2);
+				}
+
+				adaptor.addChild(root_1, buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", smali_file_stack.peek().classAnnotations));
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+			smali_file_stack.pop();
+		}
+		return retval;
+	}
+	// $ANTLR end "smali_file"
+
+
+	public static class class_spec_return extends ParserRuleReturnScope {
+		public String className;
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "class_spec"
+	// smaliParser.g:455:1: class_spec returns [String className] : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list ;
+	public final smaliParser.class_spec_return class_spec() throws RecognitionException {
+		smaliParser.class_spec_return retval = new smaliParser.class_spec_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token CLASS_DIRECTIVE9=null;
+		Token CLASS_DESCRIPTOR11=null;
+		ParserRuleReturnScope access_list10 =null;
+
+		CommonTree CLASS_DIRECTIVE9_tree=null;
+		CommonTree CLASS_DESCRIPTOR11_tree=null;
+		RewriteRuleTokenStream stream_CLASS_DESCRIPTOR=new RewriteRuleTokenStream(adaptor,"token CLASS_DESCRIPTOR");
+		RewriteRuleTokenStream stream_CLASS_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token CLASS_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_access_list=new RewriteRuleSubtreeStream(adaptor,"rule access_list");
+
+		try {
+			// smaliParser.g:456:3: ( CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list )
+			// smaliParser.g:456:5: CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR
+			{
+			CLASS_DIRECTIVE9=(Token)match(input,CLASS_DIRECTIVE,FOLLOW_CLASS_DIRECTIVE_in_class_spec1221);  
+			stream_CLASS_DIRECTIVE.add(CLASS_DIRECTIVE9);
+
+			pushFollow(FOLLOW_access_list_in_class_spec1223);
+			access_list10=access_list();
+			state._fsp--;
+
+			stream_access_list.add(access_list10.getTree());
+			CLASS_DESCRIPTOR11=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec1225);  
+			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR11);
+
+			retval.className = (CLASS_DESCRIPTOR11!=null?CLASS_DESCRIPTOR11.getText():null);
+			// AST REWRITE
+			// elements: access_list, CLASS_DESCRIPTOR
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 456:89: -> CLASS_DESCRIPTOR access_list
+			{
+				adaptor.addChild(root_0, stream_CLASS_DESCRIPTOR.nextNode());
+				adaptor.addChild(root_0, stream_access_list.nextTree());
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "class_spec"
+
+
+	public static class super_spec_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "super_spec"
+	// smaliParser.g:458:1: super_spec : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) ;
+	public final smaliParser.super_spec_return super_spec() throws RecognitionException {
+		smaliParser.super_spec_return retval = new smaliParser.super_spec_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token SUPER_DIRECTIVE12=null;
+		Token CLASS_DESCRIPTOR13=null;
+
+		CommonTree SUPER_DIRECTIVE12_tree=null;
+		CommonTree CLASS_DESCRIPTOR13_tree=null;
+		RewriteRuleTokenStream stream_CLASS_DESCRIPTOR=new RewriteRuleTokenStream(adaptor,"token CLASS_DESCRIPTOR");
+		RewriteRuleTokenStream stream_SUPER_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token SUPER_DIRECTIVE");
+
+		try {
+			// smaliParser.g:459:3: ( SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) )
+			// smaliParser.g:459:5: SUPER_DIRECTIVE CLASS_DESCRIPTOR
+			{
+			SUPER_DIRECTIVE12=(Token)match(input,SUPER_DIRECTIVE,FOLLOW_SUPER_DIRECTIVE_in_super_spec1243);  
+			stream_SUPER_DIRECTIVE.add(SUPER_DIRECTIVE12);
+
+			CLASS_DESCRIPTOR13=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec1245);  
+			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR13);
+
+			// AST REWRITE
+			// elements: CLASS_DESCRIPTOR
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 459:38: -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR )
+			{
+				// smaliParser.g:459:41: ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SUPER, (retval.start), "I_SUPER"), root_1);
+				adaptor.addChild(root_1, stream_CLASS_DESCRIPTOR.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "super_spec"
+
+
+	public static class implements_spec_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "implements_spec"
+	// smaliParser.g:461:1: implements_spec : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) ;
+	public final smaliParser.implements_spec_return implements_spec() throws RecognitionException {
+		smaliParser.implements_spec_return retval = new smaliParser.implements_spec_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token IMPLEMENTS_DIRECTIVE14=null;
+		Token CLASS_DESCRIPTOR15=null;
+
+		CommonTree IMPLEMENTS_DIRECTIVE14_tree=null;
+		CommonTree CLASS_DESCRIPTOR15_tree=null;
+		RewriteRuleTokenStream stream_IMPLEMENTS_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token IMPLEMENTS_DIRECTIVE");
+		RewriteRuleTokenStream stream_CLASS_DESCRIPTOR=new RewriteRuleTokenStream(adaptor,"token CLASS_DESCRIPTOR");
+
+		try {
+			// smaliParser.g:462:3: ( IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) )
+			// smaliParser.g:462:5: IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR
+			{
+			IMPLEMENTS_DIRECTIVE14=(Token)match(input,IMPLEMENTS_DIRECTIVE,FOLLOW_IMPLEMENTS_DIRECTIVE_in_implements_spec1264);  
+			stream_IMPLEMENTS_DIRECTIVE.add(IMPLEMENTS_DIRECTIVE14);
+
+			CLASS_DESCRIPTOR15=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec1266);  
+			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR15);
+
+			// AST REWRITE
+			// elements: CLASS_DESCRIPTOR
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 462:43: -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR )
+			{
+				// smaliParser.g:462:46: ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_IMPLEMENTS, (retval.start), "I_IMPLEMENTS"), root_1);
+				adaptor.addChild(root_1, stream_CLASS_DESCRIPTOR.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "implements_spec"
+
+
+	public static class source_spec_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "source_spec"
+	// smaliParser.g:464:1: source_spec : SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) ;
+	public final smaliParser.source_spec_return source_spec() throws RecognitionException {
+		smaliParser.source_spec_return retval = new smaliParser.source_spec_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token SOURCE_DIRECTIVE16=null;
+		Token STRING_LITERAL17=null;
+
+		CommonTree SOURCE_DIRECTIVE16_tree=null;
+		CommonTree STRING_LITERAL17_tree=null;
+		RewriteRuleTokenStream stream_SOURCE_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token SOURCE_DIRECTIVE");
+		RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL");
+
+		try {
+			// smaliParser.g:465:3: ( SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) )
+			// smaliParser.g:465:5: SOURCE_DIRECTIVE STRING_LITERAL
+			{
+			SOURCE_DIRECTIVE16=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_spec1285);  
+			stream_SOURCE_DIRECTIVE.add(SOURCE_DIRECTIVE16);
+
+			STRING_LITERAL17=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_spec1287);  
+			stream_STRING_LITERAL.add(STRING_LITERAL17);
+
+			// AST REWRITE
+			// elements: STRING_LITERAL
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 465:37: -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL )
+			{
+				// smaliParser.g:465:40: ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SOURCE, (retval.start), "I_SOURCE"), root_1);
+				adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "source_spec"
+
+
+	public static class access_list_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "access_list"
+	// smaliParser.g:467:1: access_list : ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) ;
+	public final smaliParser.access_list_return access_list() throws RecognitionException {
+		smaliParser.access_list_return retval = new smaliParser.access_list_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token ACCESS_SPEC18=null;
+
+		CommonTree ACCESS_SPEC18_tree=null;
+		RewriteRuleTokenStream stream_ACCESS_SPEC=new RewriteRuleTokenStream(adaptor,"token ACCESS_SPEC");
+
+		try {
+			// smaliParser.g:468:3: ( ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) )
+			// smaliParser.g:468:5: ( ACCESS_SPEC )*
+			{
+			// smaliParser.g:468:5: ( ACCESS_SPEC )*
+			loop2:
+			while (true) {
+				int alt2=2;
+				int LA2_0 = input.LA(1);
+				if ( (LA2_0==ACCESS_SPEC) ) {
+					int LA2_2 = input.LA(2);
+					if ( (LA2_2==ACCESS_SPEC||LA2_2==ANNOTATION_VISIBILITY||LA2_2==BOOL_LITERAL||LA2_2==CLASS_DESCRIPTOR||LA2_2==DOUBLE_LITERAL_OR_ID||LA2_2==FLOAT_LITERAL_OR_ID||(LA2_2 >= INSTRUCTION_FORMAT10t && LA2_2 <= INSTRUCTION_FORMAT10x_ODEX)||LA2_2==INSTRUCTION_FORMAT11x||LA2_2==INSTRUCTION_FORMAT12x_OR_ID||(LA2_2 >= INSTRUCTION_FORMAT21c_FIELD && LA2_2 <= INSTRUCTION_FORMAT21c_TYPE)||LA2_2==INSTRUCTION_FORMAT21t||(LA2_2 >= INSTRUCTION_FORMAT22c_FIELD && LA2_2 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA2_2 >= INSTRUCTION_FORMAT22s_OR_ID && LA2_2 <= INSTRUCTION_FORMAT22t)||LA2_2==INSTRUCTION_FORMAT23x||(LA2_2 >= INSTRUCTION_FORMAT31i_OR_ID && LA2_2 <= INSTRUCTION_FORMAT31t)||(LA2_2 >= INSTRUCTION_FORMAT35c_METHOD && LA2_2 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA2_2 >= INSTRUCTION_FORMAT45cc_METHOD && LA2_2 <= INSTRUCTION_FORMAT51l)||LA2_2==MEMBER_NAME||(LA2_2 >= NEGATIVE_INTEGER_LITERAL && LA2_2 <= NULL_LITERAL)||(LA2_2 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA2_2 <= PRIMITIVE_TYPE)||LA2_2==REGISTER||LA2_2==SIMPLE_NAME||(LA2_2 >= VERIFICATION_ERROR_TYPE && LA2_2 <= VOID_TYPE)) ) {
+						alt2=1;
+					}
+
+				}
+
+				switch (alt2) {
+				case 1 :
+					// smaliParser.g:468:5: ACCESS_SPEC
+					{
+					ACCESS_SPEC18=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list1306);  
+					stream_ACCESS_SPEC.add(ACCESS_SPEC18);
+
+					}
+					break;
+
+				default :
+					break loop2;
+				}
+			}
+
+			// AST REWRITE
+			// elements: ACCESS_SPEC
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 468:18: -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* )
+			{
+				// smaliParser.g:468:21: ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ACCESS_LIST, (retval.start), "I_ACCESS_LIST"), root_1);
+				// smaliParser.g:468:61: ( ACCESS_SPEC )*
+				while ( stream_ACCESS_SPEC.hasNext() ) {
+					adaptor.addChild(root_1, stream_ACCESS_SPEC.nextNode());
+				}
+				stream_ACCESS_SPEC.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "access_list"
+
+
+	public static class field_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "field"
+	// smaliParser.g:475:1: field : FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) ;
+	public final smaliParser.field_return field() throws RecognitionException {
+		smaliParser.field_return retval = new smaliParser.field_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token FIELD_DIRECTIVE19=null;
+		Token COLON22=null;
+		Token EQUAL24=null;
+		Token END_FIELD_DIRECTIVE27=null;
+		ParserRuleReturnScope access_list20 =null;
+		ParserRuleReturnScope member_name21 =null;
+		ParserRuleReturnScope nonvoid_type_descriptor23 =null;
+		ParserRuleReturnScope literal25 =null;
+		ParserRuleReturnScope annotation26 =null;
+
+		CommonTree FIELD_DIRECTIVE19_tree=null;
+		CommonTree COLON22_tree=null;
+		CommonTree EQUAL24_tree=null;
+		CommonTree END_FIELD_DIRECTIVE27_tree=null;
+		RewriteRuleTokenStream stream_END_FIELD_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_FIELD_DIRECTIVE");
+		RewriteRuleTokenStream stream_EQUAL=new RewriteRuleTokenStream(adaptor,"token EQUAL");
+		RewriteRuleTokenStream stream_FIELD_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token FIELD_DIRECTIVE");
+		RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
+		RewriteRuleSubtreeStream stream_annotation=new RewriteRuleSubtreeStream(adaptor,"rule annotation");
+		RewriteRuleSubtreeStream stream_access_list=new RewriteRuleSubtreeStream(adaptor,"rule access_list");
+		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
+		RewriteRuleSubtreeStream stream_member_name=new RewriteRuleSubtreeStream(adaptor,"rule member_name");
+		RewriteRuleSubtreeStream stream_literal=new RewriteRuleSubtreeStream(adaptor,"rule literal");
+
+		List<CommonTree> annotations = new ArrayList<CommonTree>();
+		try {
+			// smaliParser.g:477:3: ( FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) )
+			// smaliParser.g:477:5: FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) )
+			{
+			FIELD_DIRECTIVE19=(Token)match(input,FIELD_DIRECTIVE,FOLLOW_FIELD_DIRECTIVE_in_field1337);  
+			stream_FIELD_DIRECTIVE.add(FIELD_DIRECTIVE19);
+
+			pushFollow(FOLLOW_access_list_in_field1339);
+			access_list20=access_list();
+			state._fsp--;
+
+			stream_access_list.add(access_list20.getTree());
+			pushFollow(FOLLOW_member_name_in_field1341);
+			member_name21=member_name();
+			state._fsp--;
+
+			stream_member_name.add(member_name21.getTree());
+			COLON22=(Token)match(input,COLON,FOLLOW_COLON_in_field1343);  
+			stream_COLON.add(COLON22);
+
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_field1345);
+			nonvoid_type_descriptor23=nonvoid_type_descriptor();
+			state._fsp--;
+
+			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor23.getTree());
+			// smaliParser.g:477:75: ( EQUAL literal )?
+			int alt3=2;
+			int LA3_0 = input.LA(1);
+			if ( (LA3_0==EQUAL) ) {
+				alt3=1;
+			}
+			switch (alt3) {
+				case 1 :
+					// smaliParser.g:477:76: EQUAL literal
+					{
+					EQUAL24=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_field1348);  
+					stream_EQUAL.add(EQUAL24);
+
+					pushFollow(FOLLOW_literal_in_field1350);
+					literal25=literal();
+					state._fsp--;
+
+					stream_literal.add(literal25.getTree());
+					}
+					break;
+
+			}
+
+			// smaliParser.g:478:5: ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) )
+			// smaliParser.g:478:7: ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) )
+			{
+			// smaliParser.g:478:7: ({...}? annotation )*
+			loop4:
+			while (true) {
+				int alt4=2;
+				int LA4_0 = input.LA(1);
+				if ( (LA4_0==ANNOTATION_DIRECTIVE) ) {
+					int LA4_9 = input.LA(2);
+					if ( ((input.LA(1) == ANNOTATION_DIRECTIVE)) ) {
+						alt4=1;
+					}
+
+				}
+
+				switch (alt4) {
+				case 1 :
+					// smaliParser.g:478:8: {...}? annotation
+					{
+					if ( !((input.LA(1) == ANNOTATION_DIRECTIVE)) ) {
+						throw new FailedPredicateException(input, "field", "input.LA(1) == ANNOTATION_DIRECTIVE");
+					}
+					pushFollow(FOLLOW_annotation_in_field1363);
+					annotation26=annotation();
+					state._fsp--;
+
+					stream_annotation.add(annotation26.getTree());
+					annotations.add((annotation26!=null?((CommonTree)annotation26.getTree()):null));
+					}
+					break;
+
+				default :
+					break loop4;
+				}
+			}
+
+			// smaliParser.g:479:7: ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) )
+			int alt5=2;
+			int LA5_0 = input.LA(1);
+			if ( (LA5_0==END_FIELD_DIRECTIVE) ) {
+				alt5=1;
+			}
+			else if ( (LA5_0==EOF||LA5_0==ANNOTATION_DIRECTIVE||LA5_0==CLASS_DIRECTIVE||LA5_0==FIELD_DIRECTIVE||LA5_0==IMPLEMENTS_DIRECTIVE||LA5_0==METHOD_DIRECTIVE||LA5_0==SOURCE_DIRECTIVE||LA5_0==SUPER_DIRECTIVE) ) {
+				alt5=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 5, 0, input);
+				throw nvae;
+			}
+
+			switch (alt5) {
+				case 1 :
+					// smaliParser.g:479:9: END_FIELD_DIRECTIVE
+					{
+					END_FIELD_DIRECTIVE27=(Token)match(input,END_FIELD_DIRECTIVE,FOLLOW_END_FIELD_DIRECTIVE_in_field1377);  
+					stream_END_FIELD_DIRECTIVE.add(END_FIELD_DIRECTIVE27);
+
+					// AST REWRITE
+					// elements: access_list, nonvoid_type_descriptor, annotation, member_name, literal
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 480:9: -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) )
+					{
+						// smaliParser.g:480:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) )
+						{
+						CommonTree root_1 = (CommonTree)adaptor.nil();
+						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD, (retval.start), "I_FIELD"), root_1);
+						adaptor.addChild(root_1, stream_member_name.nextTree());
+						adaptor.addChild(root_1, stream_access_list.nextTree());
+						// smaliParser.g:480:65: ^( I_FIELD_TYPE nonvoid_type_descriptor )
+						{
+						CommonTree root_2 = (CommonTree)adaptor.nil();
+						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_TYPE, "I_FIELD_TYPE"), root_2);
+						adaptor.addChild(root_2, stream_nonvoid_type_descriptor.nextTree());
+						adaptor.addChild(root_1, root_2);
+						}
+
+						// smaliParser.g:480:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )?
+						if ( stream_literal.hasNext() ) {
+							// smaliParser.g:480:105: ^( I_FIELD_INITIAL_VALUE literal )
+							{
+							CommonTree root_2 = (CommonTree)adaptor.nil();
+							root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_INITIAL_VALUE, "I_FIELD_INITIAL_VALUE"), root_2);
+							adaptor.addChild(root_2, stream_literal.nextTree());
+							adaptor.addChild(root_1, root_2);
+							}
+
+						}
+						stream_literal.reset();
+
+						// smaliParser.g:480:139: ^( I_ANNOTATIONS ( annotation )* )
+						{
+						CommonTree root_2 = (CommonTree)adaptor.nil();
+						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2);
+						// smaliParser.g:480:155: ( annotation )*
+						while ( stream_annotation.hasNext() ) {
+							adaptor.addChild(root_2, stream_annotation.nextTree());
+						}
+						stream_annotation.reset();
+
+						adaptor.addChild(root_1, root_2);
+						}
+
+						adaptor.addChild(root_0, root_1);
+						}
+
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:481:21: 
+					{
+					smali_file_stack.peek().classAnnotations.addAll(annotations);
+					// AST REWRITE
+					// elements: member_name, access_list, literal, nonvoid_type_descriptor
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 482:9: -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) )
+					{
+						// smaliParser.g:482:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) )
+						{
+						CommonTree root_1 = (CommonTree)adaptor.nil();
+						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD, (retval.start), "I_FIELD"), root_1);
+						adaptor.addChild(root_1, stream_member_name.nextTree());
+						adaptor.addChild(root_1, stream_access_list.nextTree());
+						// smaliParser.g:482:65: ^( I_FIELD_TYPE nonvoid_type_descriptor )
+						{
+						CommonTree root_2 = (CommonTree)adaptor.nil();
+						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_TYPE, "I_FIELD_TYPE"), root_2);
+						adaptor.addChild(root_2, stream_nonvoid_type_descriptor.nextTree());
+						adaptor.addChild(root_1, root_2);
+						}
+
+						// smaliParser.g:482:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )?
+						if ( stream_literal.hasNext() ) {
+							// smaliParser.g:482:105: ^( I_FIELD_INITIAL_VALUE literal )
+							{
+							CommonTree root_2 = (CommonTree)adaptor.nil();
+							root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_INITIAL_VALUE, "I_FIELD_INITIAL_VALUE"), root_2);
+							adaptor.addChild(root_2, stream_literal.nextTree());
+							adaptor.addChild(root_1, root_2);
+							}
+
+						}
+						stream_literal.reset();
+
+						// smaliParser.g:482:139: ^( I_ANNOTATIONS )
+						{
+						CommonTree root_2 = (CommonTree)adaptor.nil();
+						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2);
+						adaptor.addChild(root_1, root_2);
+						}
+
+						adaptor.addChild(root_0, root_1);
+						}
+
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+
+			}
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "field"
+
+
+	public static class method_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "method"
+	// smaliParser.g:486:1: method : METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) ;
+	public final smaliParser.method_return method() throws RecognitionException {
+		smaliParser.method_return retval = new smaliParser.method_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token METHOD_DIRECTIVE28=null;
+		Token END_METHOD_DIRECTIVE33=null;
+		ParserRuleReturnScope access_list29 =null;
+		ParserRuleReturnScope member_name30 =null;
+		ParserRuleReturnScope method_prototype31 =null;
+		ParserRuleReturnScope statements_and_directives32 =null;
+
+		CommonTree METHOD_DIRECTIVE28_tree=null;
+		CommonTree END_METHOD_DIRECTIVE33_tree=null;
+		RewriteRuleTokenStream stream_END_METHOD_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_METHOD_DIRECTIVE");
+		RewriteRuleTokenStream stream_METHOD_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token METHOD_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_method_prototype=new RewriteRuleSubtreeStream(adaptor,"rule method_prototype");
+		RewriteRuleSubtreeStream stream_access_list=new RewriteRuleSubtreeStream(adaptor,"rule access_list");
+		RewriteRuleSubtreeStream stream_member_name=new RewriteRuleSubtreeStream(adaptor,"rule member_name");
+		RewriteRuleSubtreeStream stream_statements_and_directives=new RewriteRuleSubtreeStream(adaptor,"rule statements_and_directives");
+
+		try {
+			// smaliParser.g:487:3: ( METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) )
+			// smaliParser.g:487:5: METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE
+			{
+			METHOD_DIRECTIVE28=(Token)match(input,METHOD_DIRECTIVE,FOLLOW_METHOD_DIRECTIVE_in_method1488);  
+			stream_METHOD_DIRECTIVE.add(METHOD_DIRECTIVE28);
+
+			pushFollow(FOLLOW_access_list_in_method1490);
+			access_list29=access_list();
+			state._fsp--;
+
+			stream_access_list.add(access_list29.getTree());
+			pushFollow(FOLLOW_member_name_in_method1492);
+			member_name30=member_name();
+			state._fsp--;
+
+			stream_member_name.add(member_name30.getTree());
+			pushFollow(FOLLOW_method_prototype_in_method1494);
+			method_prototype31=method_prototype();
+			state._fsp--;
+
+			stream_method_prototype.add(method_prototype31.getTree());
+			pushFollow(FOLLOW_statements_and_directives_in_method1496);
+			statements_and_directives32=statements_and_directives();
+			state._fsp--;
+
+			stream_statements_and_directives.add(statements_and_directives32.getTree());
+			END_METHOD_DIRECTIVE33=(Token)match(input,END_METHOD_DIRECTIVE,FOLLOW_END_METHOD_DIRECTIVE_in_method1502);  
+			stream_END_METHOD_DIRECTIVE.add(END_METHOD_DIRECTIVE33);
+
+			// AST REWRITE
+			// elements: method_prototype, access_list, member_name, statements_and_directives
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 489:5: -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives )
+			{
+				// smaliParser.g:489:8: ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHOD, (retval.start), "I_METHOD"), root_1);
+				adaptor.addChild(root_1, stream_member_name.nextTree());
+				adaptor.addChild(root_1, stream_method_prototype.nextTree());
+				adaptor.addChild(root_1, stream_access_list.nextTree());
+				adaptor.addChild(root_1, stream_statements_and_directives.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "method"
+
+
+	protected static class statements_and_directives_scope {
+		boolean hasRegistersDirective;
+		List<CommonTree> methodAnnotations;
+	}
+	protected Stack<statements_and_directives_scope> statements_and_directives_stack = new Stack<statements_and_directives_scope>();
+
+	public static class statements_and_directives_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "statements_and_directives"
+	// smaliParser.g:491:1: statements_and_directives : ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) ;
+	public final smaliParser.statements_and_directives_return statements_and_directives() throws RecognitionException {
+		statements_and_directives_stack.push(new statements_and_directives_scope());
+		smaliParser.statements_and_directives_return retval = new smaliParser.statements_and_directives_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		ParserRuleReturnScope ordered_method_item34 =null;
+		ParserRuleReturnScope registers_directive35 =null;
+		ParserRuleReturnScope catch_directive36 =null;
+		ParserRuleReturnScope catchall_directive37 =null;
+		ParserRuleReturnScope parameter_directive38 =null;
+		ParserRuleReturnScope annotation39 =null;
+
+		RewriteRuleSubtreeStream stream_annotation=new RewriteRuleSubtreeStream(adaptor,"rule annotation");
+		RewriteRuleSubtreeStream stream_catchall_directive=new RewriteRuleSubtreeStream(adaptor,"rule catchall_directive");
+		RewriteRuleSubtreeStream stream_registers_directive=new RewriteRuleSubtreeStream(adaptor,"rule registers_directive");
+		RewriteRuleSubtreeStream stream_catch_directive=new RewriteRuleSubtreeStream(adaptor,"rule catch_directive");
+		RewriteRuleSubtreeStream stream_ordered_method_item=new RewriteRuleSubtreeStream(adaptor,"rule ordered_method_item");
+		RewriteRuleSubtreeStream stream_parameter_directive=new RewriteRuleSubtreeStream(adaptor,"rule parameter_directive");
+
+		try {
+			// smaliParser.g:497:3: ( ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) )
+			// smaliParser.g:497:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )*
+			{
+
+			      statements_and_directives_stack.peek().hasRegistersDirective = false;
+			      statements_and_directives_stack.peek().methodAnnotations = new ArrayList<CommonTree>();
+			    
+			// smaliParser.g:501:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )*
+			loop6:
+			while (true) {
+				int alt6=7;
+				switch ( input.LA(1) ) {
+				case ARRAY_DATA_DIRECTIVE:
+				case COLON:
+				case END_LOCAL_DIRECTIVE:
+				case EPILOGUE_DIRECTIVE:
+				case INSTRUCTION_FORMAT10t:
+				case INSTRUCTION_FORMAT10x:
+				case INSTRUCTION_FORMAT10x_ODEX:
+				case INSTRUCTION_FORMAT11n:
+				case INSTRUCTION_FORMAT11x:
+				case INSTRUCTION_FORMAT12x:
+				case INSTRUCTION_FORMAT12x_OR_ID:
+				case INSTRUCTION_FORMAT20bc:
+				case INSTRUCTION_FORMAT20t:
+				case INSTRUCTION_FORMAT21c_FIELD:
+				case INSTRUCTION_FORMAT21c_FIELD_ODEX:
+				case INSTRUCTION_FORMAT21c_STRING:
+				case INSTRUCTION_FORMAT21c_TYPE:
+				case INSTRUCTION_FORMAT21ih:
+				case INSTRUCTION_FORMAT21lh:
+				case INSTRUCTION_FORMAT21s:
+				case INSTRUCTION_FORMAT21t:
+				case INSTRUCTION_FORMAT22b:
+				case INSTRUCTION_FORMAT22c_FIELD:
+				case INSTRUCTION_FORMAT22c_FIELD_ODEX:
+				case INSTRUCTION_FORMAT22c_TYPE:
+				case INSTRUCTION_FORMAT22cs_FIELD:
+				case INSTRUCTION_FORMAT22s:
+				case INSTRUCTION_FORMAT22s_OR_ID:
+				case INSTRUCTION_FORMAT22t:
+				case INSTRUCTION_FORMAT22x:
+				case INSTRUCTION_FORMAT23x:
+				case INSTRUCTION_FORMAT30t:
+				case INSTRUCTION_FORMAT31c:
+				case INSTRUCTION_FORMAT31i:
+				case INSTRUCTION_FORMAT31i_OR_ID:
+				case INSTRUCTION_FORMAT31t:
+				case INSTRUCTION_FORMAT32x:
+				case INSTRUCTION_FORMAT35c_METHOD:
+				case INSTRUCTION_FORMAT35c_METHOD_ODEX:
+				case INSTRUCTION_FORMAT35c_TYPE:
+				case INSTRUCTION_FORMAT35mi_METHOD:
+				case INSTRUCTION_FORMAT35ms_METHOD:
+				case INSTRUCTION_FORMAT3rc_METHOD:
+				case INSTRUCTION_FORMAT3rc_METHOD_ODEX:
+				case INSTRUCTION_FORMAT3rc_TYPE:
+				case INSTRUCTION_FORMAT3rmi_METHOD:
+				case INSTRUCTION_FORMAT3rms_METHOD:
+				case INSTRUCTION_FORMAT45cc_METHOD:
+				case INSTRUCTION_FORMAT4rcc_METHOD:
+				case INSTRUCTION_FORMAT51l:
+				case LINE_DIRECTIVE:
+				case LOCAL_DIRECTIVE:
+				case PACKED_SWITCH_DIRECTIVE:
+				case PROLOGUE_DIRECTIVE:
+				case RESTART_LOCAL_DIRECTIVE:
+				case SOURCE_DIRECTIVE:
+				case SPARSE_SWITCH_DIRECTIVE:
+					{
+					alt6=1;
+					}
+					break;
+				case LOCALS_DIRECTIVE:
+				case REGISTERS_DIRECTIVE:
+					{
+					alt6=2;
+					}
+					break;
+				case CATCH_DIRECTIVE:
+					{
+					alt6=3;
+					}
+					break;
+				case CATCHALL_DIRECTIVE:
+					{
+					alt6=4;
+					}
+					break;
+				case PARAMETER_DIRECTIVE:
+					{
+					alt6=5;
+					}
+					break;
+				case ANNOTATION_DIRECTIVE:
+					{
+					alt6=6;
+					}
+					break;
+				}
+				switch (alt6) {
+				case 1 :
+					// smaliParser.g:501:7: ordered_method_item
+					{
+					pushFollow(FOLLOW_ordered_method_item_in_statements_and_directives1547);
+					ordered_method_item34=ordered_method_item();
+					state._fsp--;
+
+					stream_ordered_method_item.add(ordered_method_item34.getTree());
+					}
+					break;
+				case 2 :
+					// smaliParser.g:502:7: registers_directive
+					{
+					pushFollow(FOLLOW_registers_directive_in_statements_and_directives1555);
+					registers_directive35=registers_directive();
+					state._fsp--;
+
+					stream_registers_directive.add(registers_directive35.getTree());
+					}
+					break;
+				case 3 :
+					// smaliParser.g:503:7: catch_directive
+					{
+					pushFollow(FOLLOW_catch_directive_in_statements_and_directives1563);
+					catch_directive36=catch_directive();
+					state._fsp--;
+
+					stream_catch_directive.add(catch_directive36.getTree());
+					}
+					break;
+				case 4 :
+					// smaliParser.g:504:7: catchall_directive
+					{
+					pushFollow(FOLLOW_catchall_directive_in_statements_and_directives1571);
+					catchall_directive37=catchall_directive();
+					state._fsp--;
+
+					stream_catchall_directive.add(catchall_directive37.getTree());
+					}
+					break;
+				case 5 :
+					// smaliParser.g:505:7: parameter_directive
+					{
+					pushFollow(FOLLOW_parameter_directive_in_statements_and_directives1579);
+					parameter_directive38=parameter_directive();
+					state._fsp--;
+
+					stream_parameter_directive.add(parameter_directive38.getTree());
+					}
+					break;
+				case 6 :
+					// smaliParser.g:506:7: annotation
+					{
+					pushFollow(FOLLOW_annotation_in_statements_and_directives1587);
+					annotation39=annotation();
+					state._fsp--;
+
+					stream_annotation.add(annotation39.getTree());
+					statements_and_directives_stack.peek().methodAnnotations.add((annotation39!=null?((CommonTree)annotation39.getTree()):null));
+					}
+					break;
+
+				default :
+					break loop6;
+				}
+			}
+
+			// AST REWRITE
+			// elements: ordered_method_item, catch_directive, catchall_directive, parameter_directive, registers_directive
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 508:5: -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* )
+			{
+				// smaliParser.g:508:8: ( registers_directive )?
+				if ( stream_registers_directive.hasNext() ) {
+					adaptor.addChild(root_0, stream_registers_directive.nextTree());
+				}
+				stream_registers_directive.reset();
+
+				// smaliParser.g:509:8: ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ORDERED_METHOD_ITEMS, "I_ORDERED_METHOD_ITEMS"), root_1);
+				// smaliParser.g:509:33: ( ordered_method_item )*
+				while ( stream_ordered_method_item.hasNext() ) {
+					adaptor.addChild(root_1, stream_ordered_method_item.nextTree());
+				}
+				stream_ordered_method_item.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+				// smaliParser.g:510:8: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CATCHES, "I_CATCHES"), root_1);
+				// smaliParser.g:510:20: ( catch_directive )*
+				while ( stream_catch_directive.hasNext() ) {
+					adaptor.addChild(root_1, stream_catch_directive.nextTree());
+				}
+				stream_catch_directive.reset();
+
+				// smaliParser.g:510:37: ( catchall_directive )*
+				while ( stream_catchall_directive.hasNext() ) {
+					adaptor.addChild(root_1, stream_catchall_directive.nextTree());
+				}
+				stream_catchall_directive.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+				// smaliParser.g:511:8: ^( I_PARAMETERS ( parameter_directive )* )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PARAMETERS, "I_PARAMETERS"), root_1);
+				// smaliParser.g:511:23: ( parameter_directive )*
+				while ( stream_parameter_directive.hasNext() ) {
+					adaptor.addChild(root_1, stream_parameter_directive.nextTree());
+				}
+				stream_parameter_directive.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+				adaptor.addChild(root_0, buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", statements_and_directives_stack.peek().methodAnnotations));
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+			statements_and_directives_stack.pop();
+		}
+		return retval;
+	}
+	// $ANTLR end "statements_and_directives"
+
+
+	public static class ordered_method_item_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "ordered_method_item"
+	// smaliParser.g:515:1: ordered_method_item : ( label | instruction | debug_directive );
+	public final smaliParser.ordered_method_item_return ordered_method_item() throws RecognitionException {
+		smaliParser.ordered_method_item_return retval = new smaliParser.ordered_method_item_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		ParserRuleReturnScope label40 =null;
+		ParserRuleReturnScope instruction41 =null;
+		ParserRuleReturnScope debug_directive42 =null;
+
+
+		try {
+			// smaliParser.g:516:3: ( label | instruction | debug_directive )
+			int alt7=3;
+			switch ( input.LA(1) ) {
+			case COLON:
+				{
+				alt7=1;
+				}
+				break;
+			case ARRAY_DATA_DIRECTIVE:
+			case INSTRUCTION_FORMAT10t:
+			case INSTRUCTION_FORMAT10x:
+			case INSTRUCTION_FORMAT10x_ODEX:
+			case INSTRUCTION_FORMAT11n:
+			case INSTRUCTION_FORMAT11x:
+			case INSTRUCTION_FORMAT12x:
+			case INSTRUCTION_FORMAT12x_OR_ID:
+			case INSTRUCTION_FORMAT20bc:
+			case INSTRUCTION_FORMAT20t:
+			case INSTRUCTION_FORMAT21c_FIELD:
+			case INSTRUCTION_FORMAT21c_FIELD_ODEX:
+			case INSTRUCTION_FORMAT21c_STRING:
+			case INSTRUCTION_FORMAT21c_TYPE:
+			case INSTRUCTION_FORMAT21ih:
+			case INSTRUCTION_FORMAT21lh:
+			case INSTRUCTION_FORMAT21s:
+			case INSTRUCTION_FORMAT21t:
+			case INSTRUCTION_FORMAT22b:
+			case INSTRUCTION_FORMAT22c_FIELD:
+			case INSTRUCTION_FORMAT22c_FIELD_ODEX:
+			case INSTRUCTION_FORMAT22c_TYPE:
+			case INSTRUCTION_FORMAT22cs_FIELD:
+			case INSTRUCTION_FORMAT22s:
+			case INSTRUCTION_FORMAT22s_OR_ID:
+			case INSTRUCTION_FORMAT22t:
+			case INSTRUCTION_FORMAT22x:
+			case INSTRUCTION_FORMAT23x:
+			case INSTRUCTION_FORMAT30t:
+			case INSTRUCTION_FORMAT31c:
+			case INSTRUCTION_FORMAT31i:
+			case INSTRUCTION_FORMAT31i_OR_ID:
+			case INSTRUCTION_FORMAT31t:
+			case INSTRUCTION_FORMAT32x:
+			case INSTRUCTION_FORMAT35c_METHOD:
+			case INSTRUCTION_FORMAT35c_METHOD_ODEX:
+			case INSTRUCTION_FORMAT35c_TYPE:
+			case INSTRUCTION_FORMAT35mi_METHOD:
+			case INSTRUCTION_FORMAT35ms_METHOD:
+			case INSTRUCTION_FORMAT3rc_METHOD:
+			case INSTRUCTION_FORMAT3rc_METHOD_ODEX:
+			case INSTRUCTION_FORMAT3rc_TYPE:
+			case INSTRUCTION_FORMAT3rmi_METHOD:
+			case INSTRUCTION_FORMAT3rms_METHOD:
+			case INSTRUCTION_FORMAT45cc_METHOD:
+			case INSTRUCTION_FORMAT4rcc_METHOD:
+			case INSTRUCTION_FORMAT51l:
+			case PACKED_SWITCH_DIRECTIVE:
+			case SPARSE_SWITCH_DIRECTIVE:
+				{
+				alt7=2;
+				}
+				break;
+			case END_LOCAL_DIRECTIVE:
+			case EPILOGUE_DIRECTIVE:
+			case LINE_DIRECTIVE:
+			case LOCAL_DIRECTIVE:
+			case PROLOGUE_DIRECTIVE:
+			case RESTART_LOCAL_DIRECTIVE:
+			case SOURCE_DIRECTIVE:
+				{
+				alt7=3;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 7, 0, input);
+				throw nvae;
+			}
+			switch (alt7) {
+				case 1 :
+					// smaliParser.g:516:5: label
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_label_in_ordered_method_item1672);
+					label40=label();
+					state._fsp--;
+
+					adaptor.addChild(root_0, label40.getTree());
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:517:5: instruction
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_instruction_in_ordered_method_item1678);
+					instruction41=instruction();
+					state._fsp--;
+
+					adaptor.addChild(root_0, instruction41.getTree());
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:518:5: debug_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_debug_directive_in_ordered_method_item1684);
+					debug_directive42=debug_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, debug_directive42.getTree());
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "ordered_method_item"
+
+
+	public static class registers_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "registers_directive"
+	// smaliParser.g:520:1: registers_directive : (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) ;
+	public final smaliParser.registers_directive_return registers_directive() throws RecognitionException {
+		smaliParser.registers_directive_return retval = new smaliParser.registers_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token directive=null;
+		ParserRuleReturnScope regCount =null;
+		ParserRuleReturnScope regCount2 =null;
+
+		CommonTree directive_tree=null;
+		RewriteRuleTokenStream stream_LOCALS_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token LOCALS_DIRECTIVE");
+		RewriteRuleTokenStream stream_REGISTERS_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token REGISTERS_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
+
+		try {
+			// smaliParser.g:521:3: ( (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) )
+			// smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) )
+			{
+			// smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) )
+			int alt8=2;
+			int LA8_0 = input.LA(1);
+			if ( (LA8_0==REGISTERS_DIRECTIVE) ) {
+				alt8=1;
+			}
+			else if ( (LA8_0==LOCALS_DIRECTIVE) ) {
+				alt8=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 8, 0, input);
+				throw nvae;
+			}
+
+			switch (alt8) {
+				case 1 :
+					// smaliParser.g:522:7: directive= REGISTERS_DIRECTIVE regCount= integral_literal
+					{
+					directive=(Token)match(input,REGISTERS_DIRECTIVE,FOLLOW_REGISTERS_DIRECTIVE_in_registers_directive1704);  
+					stream_REGISTERS_DIRECTIVE.add(directive);
+
+					pushFollow(FOLLOW_integral_literal_in_registers_directive1708);
+					regCount=integral_literal();
+					state._fsp--;
+
+					stream_integral_literal.add(regCount.getTree());
+					// AST REWRITE
+					// elements: regCount
+					// token labels: 
+					// rule labels: regCount, retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_regCount=new RewriteRuleSubtreeStream(adaptor,"rule regCount",regCount!=null?regCount.getTree():null);
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 522:63: -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount)
+					{
+						// smaliParser.g:522:66: ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount)
+						{
+						CommonTree root_1 = (CommonTree)adaptor.nil();
+						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTERS, directive, "I_REGISTERS"), root_1);
+						adaptor.addChild(root_1, stream_regCount.nextTree());
+						adaptor.addChild(root_0, root_1);
+						}
+
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:523:7: directive= LOCALS_DIRECTIVE regCount2= integral_literal
+					{
+					directive=(Token)match(input,LOCALS_DIRECTIVE,FOLLOW_LOCALS_DIRECTIVE_in_registers_directive1728);  
+					stream_LOCALS_DIRECTIVE.add(directive);
+
+					pushFollow(FOLLOW_integral_literal_in_registers_directive1732);
+					regCount2=integral_literal();
+					state._fsp--;
+
+					stream_integral_literal.add(regCount2.getTree());
+					// AST REWRITE
+					// elements: regCount2
+					// token labels: 
+					// rule labels: regCount2, retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_regCount2=new RewriteRuleSubtreeStream(adaptor,"rule regCount2",regCount2!=null?regCount2.getTree():null);
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 523:61: -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2)
+					{
+						// smaliParser.g:523:64: ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2)
+						{
+						CommonTree root_1 = (CommonTree)adaptor.nil();
+						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LOCALS, directive, "I_LOCALS"), root_1);
+						adaptor.addChild(root_1, stream_regCount2.nextTree());
+						adaptor.addChild(root_0, root_1);
+						}
+
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+
+
+			      if (statements_and_directives_stack.peek().hasRegistersDirective) {
+			        throw new SemanticException(input, directive, "There can only be a single .registers or .locals directive in a method");
+			      }
+			      statements_and_directives_stack.peek().hasRegistersDirective =true;
+			    
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "registers_directive"
+
+
+	public static class param_list_or_id_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "param_list_or_id"
+	// smaliParser.g:532:1: param_list_or_id : ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ ;
+	public final smaliParser.param_list_or_id_return param_list_or_id() throws RecognitionException {
+		smaliParser.param_list_or_id_return retval = new smaliParser.param_list_or_id_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token PARAM_LIST_OR_ID_PRIMITIVE_TYPE43=null;
+
+		CommonTree PARAM_LIST_OR_ID_PRIMITIVE_TYPE43_tree=null;
+
+		try {
+			// smaliParser.g:533:3: ( ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ )
+			// smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			// smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+
+			int cnt9=0;
+			loop9:
+			while (true) {
+				int alt9=2;
+				int LA9_0 = input.LA(1);
+				if ( (LA9_0==PARAM_LIST_OR_ID_PRIMITIVE_TYPE) ) {
+					alt9=1;
+				}
+
+				switch (alt9) {
+				case 1 :
+					// smaliParser.g:533:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE
+					{
+					PARAM_LIST_OR_ID_PRIMITIVE_TYPE43=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id1764); 
+					PARAM_LIST_OR_ID_PRIMITIVE_TYPE43_tree = (CommonTree)adaptor.create(PARAM_LIST_OR_ID_PRIMITIVE_TYPE43);
+					adaptor.addChild(root_0, PARAM_LIST_OR_ID_PRIMITIVE_TYPE43_tree);
+
+					}
+					break;
+
+				default :
+					if ( cnt9 >= 1 ) break loop9;
+					EarlyExitException eee = new EarlyExitException(9, input);
+					throw eee;
+				}
+				cnt9++;
+			}
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "param_list_or_id"
+
+
+	public static class simple_name_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "simple_name"
+	// smaliParser.g:537:1: simple_name : ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] );
+	public final smaliParser.simple_name_return simple_name() throws RecognitionException {
+		smaliParser.simple_name_return retval = new smaliParser.simple_name_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token SIMPLE_NAME44=null;
+		Token ACCESS_SPEC45=null;
+		Token VERIFICATION_ERROR_TYPE46=null;
+		Token POSITIVE_INTEGER_LITERAL47=null;
+		Token NEGATIVE_INTEGER_LITERAL48=null;
+		Token FLOAT_LITERAL_OR_ID49=null;
+		Token DOUBLE_LITERAL_OR_ID50=null;
+		Token BOOL_LITERAL51=null;
+		Token NULL_LITERAL52=null;
+		Token REGISTER53=null;
+		Token PRIMITIVE_TYPE55=null;
+		Token VOID_TYPE56=null;
+		Token ANNOTATION_VISIBILITY57=null;
+		Token INSTRUCTION_FORMAT10t58=null;
+		Token INSTRUCTION_FORMAT10x59=null;
+		Token INSTRUCTION_FORMAT10x_ODEX60=null;
+		Token INSTRUCTION_FORMAT11x61=null;
+		Token INSTRUCTION_FORMAT12x_OR_ID62=null;
+		Token INSTRUCTION_FORMAT21c_FIELD63=null;
+		Token INSTRUCTION_FORMAT21c_FIELD_ODEX64=null;
+		Token INSTRUCTION_FORMAT21c_STRING65=null;
+		Token INSTRUCTION_FORMAT21c_TYPE66=null;
+		Token INSTRUCTION_FORMAT21t67=null;
+		Token INSTRUCTION_FORMAT22c_FIELD68=null;
+		Token INSTRUCTION_FORMAT22c_FIELD_ODEX69=null;
+		Token INSTRUCTION_FORMAT22c_TYPE70=null;
+		Token INSTRUCTION_FORMAT22cs_FIELD71=null;
+		Token INSTRUCTION_FORMAT22s_OR_ID72=null;
+		Token INSTRUCTION_FORMAT22t73=null;
+		Token INSTRUCTION_FORMAT23x74=null;
+		Token INSTRUCTION_FORMAT31i_OR_ID75=null;
+		Token INSTRUCTION_FORMAT31t76=null;
+		Token INSTRUCTION_FORMAT35c_METHOD77=null;
+		Token INSTRUCTION_FORMAT35c_METHOD_ODEX78=null;
+		Token INSTRUCTION_FORMAT35c_TYPE79=null;
+		Token INSTRUCTION_FORMAT35mi_METHOD80=null;
+		Token INSTRUCTION_FORMAT35ms_METHOD81=null;
+		Token INSTRUCTION_FORMAT45cc_METHOD82=null;
+		Token INSTRUCTION_FORMAT4rcc_METHOD83=null;
+		Token INSTRUCTION_FORMAT51l84=null;
+		ParserRuleReturnScope param_list_or_id54 =null;
+
+		CommonTree SIMPLE_NAME44_tree=null;
+		CommonTree ACCESS_SPEC45_tree=null;
+		CommonTree VERIFICATION_ERROR_TYPE46_tree=null;
+		CommonTree POSITIVE_INTEGER_LITERAL47_tree=null;
+		CommonTree NEGATIVE_INTEGER_LITERAL48_tree=null;
+		CommonTree FLOAT_LITERAL_OR_ID49_tree=null;
+		CommonTree DOUBLE_LITERAL_OR_ID50_tree=null;
+		CommonTree BOOL_LITERAL51_tree=null;
+		CommonTree NULL_LITERAL52_tree=null;
+		CommonTree REGISTER53_tree=null;
+		CommonTree PRIMITIVE_TYPE55_tree=null;
+		CommonTree VOID_TYPE56_tree=null;
+		CommonTree ANNOTATION_VISIBILITY57_tree=null;
+		CommonTree INSTRUCTION_FORMAT10t58_tree=null;
+		CommonTree INSTRUCTION_FORMAT10x59_tree=null;
+		CommonTree INSTRUCTION_FORMAT10x_ODEX60_tree=null;
+		CommonTree INSTRUCTION_FORMAT11x61_tree=null;
+		CommonTree INSTRUCTION_FORMAT12x_OR_ID62_tree=null;
+		CommonTree INSTRUCTION_FORMAT21c_FIELD63_tree=null;
+		CommonTree INSTRUCTION_FORMAT21c_FIELD_ODEX64_tree=null;
+		CommonTree INSTRUCTION_FORMAT21c_STRING65_tree=null;
+		CommonTree INSTRUCTION_FORMAT21c_TYPE66_tree=null;
+		CommonTree INSTRUCTION_FORMAT21t67_tree=null;
+		CommonTree INSTRUCTION_FORMAT22c_FIELD68_tree=null;
+		CommonTree INSTRUCTION_FORMAT22c_FIELD_ODEX69_tree=null;
+		CommonTree INSTRUCTION_FORMAT22c_TYPE70_tree=null;
+		CommonTree INSTRUCTION_FORMAT22cs_FIELD71_tree=null;
+		CommonTree INSTRUCTION_FORMAT22s_OR_ID72_tree=null;
+		CommonTree INSTRUCTION_FORMAT22t73_tree=null;
+		CommonTree INSTRUCTION_FORMAT23x74_tree=null;
+		CommonTree INSTRUCTION_FORMAT31i_OR_ID75_tree=null;
+		CommonTree INSTRUCTION_FORMAT31t76_tree=null;
+		CommonTree INSTRUCTION_FORMAT35c_METHOD77_tree=null;
+		CommonTree INSTRUCTION_FORMAT35c_METHOD_ODEX78_tree=null;
+		CommonTree INSTRUCTION_FORMAT35c_TYPE79_tree=null;
+		CommonTree INSTRUCTION_FORMAT35mi_METHOD80_tree=null;
+		CommonTree INSTRUCTION_FORMAT35ms_METHOD81_tree=null;
+		CommonTree INSTRUCTION_FORMAT45cc_METHOD82_tree=null;
+		CommonTree INSTRUCTION_FORMAT4rcc_METHOD83_tree=null;
+		CommonTree INSTRUCTION_FORMAT51l84_tree=null;
+		RewriteRuleTokenStream stream_ANNOTATION_VISIBILITY=new RewriteRuleTokenStream(adaptor,"token ANNOTATION_VISIBILITY");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_TYPE=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_TYPE");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22t");
+		RewriteRuleTokenStream stream_VOID_TYPE=new RewriteRuleTokenStream(adaptor,"token VOID_TYPE");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT10t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT10t");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT35mi_METHOD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT35mi_METHOD");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22s_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22s_OR_ID");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22cs_FIELD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22cs_FIELD");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT12x_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT12x_OR_ID");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT35ms_METHOD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT35ms_METHOD");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT35c_METHOD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT35c_METHOD");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT45cc_METHOD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT45cc_METHOD");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT35c_TYPE=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT35c_TYPE");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT10x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT10x");
+		RewriteRuleTokenStream stream_FLOAT_LITERAL_OR_ID=new RewriteRuleTokenStream(adaptor,"token FLOAT_LITERAL_OR_ID");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22c_TYPE=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22c_TYPE");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_STRING=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_STRING");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT35c_METHOD_ODEX=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT35c_METHOD_ODEX");
+		RewriteRuleTokenStream stream_NEGATIVE_INTEGER_LITERAL=new RewriteRuleTokenStream(adaptor,"token NEGATIVE_INTEGER_LITERAL");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22c_FIELD_ODEX=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22c_FIELD_ODEX");
+		RewriteRuleTokenStream stream_DOUBLE_LITERAL_OR_ID=new RewriteRuleTokenStream(adaptor,"token DOUBLE_LITERAL_OR_ID");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT31i_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT31i_OR_ID");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21t");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT31t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT31t");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT23x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT23x");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT51l=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT51l");
+		RewriteRuleTokenStream stream_POSITIVE_INTEGER_LITERAL=new RewriteRuleTokenStream(adaptor,"token POSITIVE_INTEGER_LITERAL");
+		RewriteRuleTokenStream stream_BOOL_LITERAL=new RewriteRuleTokenStream(adaptor,"token BOOL_LITERAL");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT10x_ODEX=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT10x_ODEX");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_FIELD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_FIELD");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22c_FIELD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22c_FIELD");
+		RewriteRuleTokenStream stream_VERIFICATION_ERROR_TYPE=new RewriteRuleTokenStream(adaptor,"token VERIFICATION_ERROR_TYPE");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT11x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT11x");
+		RewriteRuleTokenStream stream_ACCESS_SPEC=new RewriteRuleTokenStream(adaptor,"token ACCESS_SPEC");
+		RewriteRuleTokenStream stream_NULL_LITERAL=new RewriteRuleTokenStream(adaptor,"token NULL_LITERAL");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT4rcc_METHOD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT4rcc_METHOD");
+		RewriteRuleTokenStream stream_PRIMITIVE_TYPE=new RewriteRuleTokenStream(adaptor,"token PRIMITIVE_TYPE");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_FIELD_ODEX=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_FIELD_ODEX");
+		RewriteRuleSubtreeStream stream_param_list_or_id=new RewriteRuleSubtreeStream(adaptor,"rule param_list_or_id");
+
+		try {
+			// smaliParser.g:538:3: ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] )
+			int alt10=41;
+			switch ( input.LA(1) ) {
+			case SIMPLE_NAME:
+				{
+				alt10=1;
+				}
+				break;
+			case ACCESS_SPEC:
+				{
+				alt10=2;
+				}
+				break;
+			case VERIFICATION_ERROR_TYPE:
+				{
+				alt10=3;
+				}
+				break;
+			case POSITIVE_INTEGER_LITERAL:
+				{
+				alt10=4;
+				}
+				break;
+			case NEGATIVE_INTEGER_LITERAL:
+				{
+				alt10=5;
+				}
+				break;
+			case FLOAT_LITERAL_OR_ID:
+				{
+				alt10=6;
+				}
+				break;
+			case DOUBLE_LITERAL_OR_ID:
+				{
+				alt10=7;
+				}
+				break;
+			case BOOL_LITERAL:
+				{
+				alt10=8;
+				}
+				break;
+			case NULL_LITERAL:
+				{
+				alt10=9;
+				}
+				break;
+			case REGISTER:
+				{
+				alt10=10;
+				}
+				break;
+			case PARAM_LIST_OR_ID_PRIMITIVE_TYPE:
+				{
+				alt10=11;
+				}
+				break;
+			case PRIMITIVE_TYPE:
+				{
+				alt10=12;
+				}
+				break;
+			case VOID_TYPE:
+				{
+				alt10=13;
+				}
+				break;
+			case ANNOTATION_VISIBILITY:
+				{
+				alt10=14;
+				}
+				break;
+			case INSTRUCTION_FORMAT10t:
+				{
+				alt10=15;
+				}
+				break;
+			case INSTRUCTION_FORMAT10x:
+				{
+				alt10=16;
+				}
+				break;
+			case INSTRUCTION_FORMAT10x_ODEX:
+				{
+				alt10=17;
+				}
+				break;
+			case INSTRUCTION_FORMAT11x:
+				{
+				alt10=18;
+				}
+				break;
+			case INSTRUCTION_FORMAT12x_OR_ID:
+				{
+				alt10=19;
+				}
+				break;
+			case INSTRUCTION_FORMAT21c_FIELD:
+				{
+				alt10=20;
+				}
+				break;
+			case INSTRUCTION_FORMAT21c_FIELD_ODEX:
+				{
+				alt10=21;
+				}
+				break;
+			case INSTRUCTION_FORMAT21c_STRING:
+				{
+				alt10=22;
+				}
+				break;
+			case INSTRUCTION_FORMAT21c_TYPE:
+				{
+				alt10=23;
+				}
+				break;
+			case INSTRUCTION_FORMAT21t:
+				{
+				alt10=24;
+				}
+				break;
+			case INSTRUCTION_FORMAT22c_FIELD:
+				{
+				alt10=25;
+				}
+				break;
+			case INSTRUCTION_FORMAT22c_FIELD_ODEX:
+				{
+				alt10=26;
+				}
+				break;
+			case INSTRUCTION_FORMAT22c_TYPE:
+				{
+				alt10=27;
+				}
+				break;
+			case INSTRUCTION_FORMAT22cs_FIELD:
+				{
+				alt10=28;
+				}
+				break;
+			case INSTRUCTION_FORMAT22s_OR_ID:
+				{
+				alt10=29;
+				}
+				break;
+			case INSTRUCTION_FORMAT22t:
+				{
+				alt10=30;
+				}
+				break;
+			case INSTRUCTION_FORMAT23x:
+				{
+				alt10=31;
+				}
+				break;
+			case INSTRUCTION_FORMAT31i_OR_ID:
+				{
+				alt10=32;
+				}
+				break;
+			case INSTRUCTION_FORMAT31t:
+				{
+				alt10=33;
+				}
+				break;
+			case INSTRUCTION_FORMAT35c_METHOD:
+				{
+				alt10=34;
+				}
+				break;
+			case INSTRUCTION_FORMAT35c_METHOD_ODEX:
+				{
+				alt10=35;
+				}
+				break;
+			case INSTRUCTION_FORMAT35c_TYPE:
+				{
+				alt10=36;
+				}
+				break;
+			case INSTRUCTION_FORMAT35mi_METHOD:
+				{
+				alt10=37;
+				}
+				break;
+			case INSTRUCTION_FORMAT35ms_METHOD:
+				{
+				alt10=38;
+				}
+				break;
+			case INSTRUCTION_FORMAT45cc_METHOD:
+				{
+				alt10=39;
+				}
+				break;
+			case INSTRUCTION_FORMAT4rcc_METHOD:
+				{
+				alt10=40;
+				}
+				break;
+			case INSTRUCTION_FORMAT51l:
+				{
+				alt10=41;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 10, 0, input);
+				throw nvae;
+			}
+			switch (alt10) {
+				case 1 :
+					// smaliParser.g:538:5: SIMPLE_NAME
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					SIMPLE_NAME44=(Token)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_simple_name1777); 
+					SIMPLE_NAME44_tree = (CommonTree)adaptor.create(SIMPLE_NAME44);
+					adaptor.addChild(root_0, SIMPLE_NAME44_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:539:5: ACCESS_SPEC
+					{
+					ACCESS_SPEC45=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_simple_name1783);  
+					stream_ACCESS_SPEC.add(ACCESS_SPEC45);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 539:17: -> SIMPLE_NAME[$ACCESS_SPEC]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, ACCESS_SPEC45));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:540:5: VERIFICATION_ERROR_TYPE
+					{
+					VERIFICATION_ERROR_TYPE46=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_simple_name1794);  
+					stream_VERIFICATION_ERROR_TYPE.add(VERIFICATION_ERROR_TYPE46);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 540:29: -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, VERIFICATION_ERROR_TYPE46));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 4 :
+					// smaliParser.g:541:5: POSITIVE_INTEGER_LITERAL
+					{
+					POSITIVE_INTEGER_LITERAL47=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_simple_name1805);  
+					stream_POSITIVE_INTEGER_LITERAL.add(POSITIVE_INTEGER_LITERAL47);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 541:30: -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, POSITIVE_INTEGER_LITERAL47));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 5 :
+					// smaliParser.g:542:5: NEGATIVE_INTEGER_LITERAL
+					{
+					NEGATIVE_INTEGER_LITERAL48=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_simple_name1816);  
+					stream_NEGATIVE_INTEGER_LITERAL.add(NEGATIVE_INTEGER_LITERAL48);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 542:30: -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, NEGATIVE_INTEGER_LITERAL48));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 6 :
+					// smaliParser.g:543:5: FLOAT_LITERAL_OR_ID
+					{
+					FLOAT_LITERAL_OR_ID49=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_simple_name1827);  
+					stream_FLOAT_LITERAL_OR_ID.add(FLOAT_LITERAL_OR_ID49);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 543:25: -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, FLOAT_LITERAL_OR_ID49));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 7 :
+					// smaliParser.g:544:5: DOUBLE_LITERAL_OR_ID
+					{
+					DOUBLE_LITERAL_OR_ID50=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_simple_name1838);  
+					stream_DOUBLE_LITERAL_OR_ID.add(DOUBLE_LITERAL_OR_ID50);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 544:26: -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, DOUBLE_LITERAL_OR_ID50));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 8 :
+					// smaliParser.g:545:5: BOOL_LITERAL
+					{
+					BOOL_LITERAL51=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_simple_name1849);  
+					stream_BOOL_LITERAL.add(BOOL_LITERAL51);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 545:18: -> SIMPLE_NAME[$BOOL_LITERAL]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, BOOL_LITERAL51));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 9 :
+					// smaliParser.g:546:5: NULL_LITERAL
+					{
+					NULL_LITERAL52=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_simple_name1860);  
+					stream_NULL_LITERAL.add(NULL_LITERAL52);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 546:18: -> SIMPLE_NAME[$NULL_LITERAL]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, NULL_LITERAL52));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 10 :
+					// smaliParser.g:547:5: REGISTER
+					{
+					REGISTER53=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_simple_name1871);  
+					stream_REGISTER.add(REGISTER53);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 547:14: -> SIMPLE_NAME[$REGISTER]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, REGISTER53));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 11 :
+					// smaliParser.g:548:5: param_list_or_id
+					{
+					pushFollow(FOLLOW_param_list_or_id_in_simple_name1882);
+					param_list_or_id54=param_list_or_id();
+					state._fsp--;
+
+					stream_param_list_or_id.add(param_list_or_id54.getTree());
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 548:22: ->
+					{
+						adaptor.addChild(root_0,  adaptor.create(SIMPLE_NAME, (param_list_or_id54!=null?input.toString(param_list_or_id54.start,param_list_or_id54.stop):null)) );
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 12 :
+					// smaliParser.g:549:5: PRIMITIVE_TYPE
+					{
+					PRIMITIVE_TYPE55=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_simple_name1892);  
+					stream_PRIMITIVE_TYPE.add(PRIMITIVE_TYPE55);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 549:20: -> SIMPLE_NAME[$PRIMITIVE_TYPE]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, PRIMITIVE_TYPE55));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 13 :
+					// smaliParser.g:550:5: VOID_TYPE
+					{
+					VOID_TYPE56=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_simple_name1903);  
+					stream_VOID_TYPE.add(VOID_TYPE56);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 550:15: -> SIMPLE_NAME[$VOID_TYPE]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, VOID_TYPE56));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 14 :
+					// smaliParser.g:551:5: ANNOTATION_VISIBILITY
+					{
+					ANNOTATION_VISIBILITY57=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_simple_name1914);  
+					stream_ANNOTATION_VISIBILITY.add(ANNOTATION_VISIBILITY57);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 551:27: -> SIMPLE_NAME[$ANNOTATION_VISIBILITY]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, ANNOTATION_VISIBILITY57));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 15 :
+					// smaliParser.g:552:5: INSTRUCTION_FORMAT10t
+					{
+					INSTRUCTION_FORMAT10t58=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_simple_name1925);  
+					stream_INSTRUCTION_FORMAT10t.add(INSTRUCTION_FORMAT10t58);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 552:27: -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT10t58));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 16 :
+					// smaliParser.g:553:5: INSTRUCTION_FORMAT10x
+					{
+					INSTRUCTION_FORMAT10x59=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_simple_name1936);  
+					stream_INSTRUCTION_FORMAT10x.add(INSTRUCTION_FORMAT10x59);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 553:27: -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT10x59));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 17 :
+					// smaliParser.g:554:5: INSTRUCTION_FORMAT10x_ODEX
+					{
+					INSTRUCTION_FORMAT10x_ODEX60=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_simple_name1947);  
+					stream_INSTRUCTION_FORMAT10x_ODEX.add(INSTRUCTION_FORMAT10x_ODEX60);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 554:32: -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT10x_ODEX60));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 18 :
+					// smaliParser.g:555:5: INSTRUCTION_FORMAT11x
+					{
+					INSTRUCTION_FORMAT11x61=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_simple_name1958);  
+					stream_INSTRUCTION_FORMAT11x.add(INSTRUCTION_FORMAT11x61);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 555:27: -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT11x61));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 19 :
+					// smaliParser.g:556:5: INSTRUCTION_FORMAT12x_OR_ID
+					{
+					INSTRUCTION_FORMAT12x_OR_ID62=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_simple_name1969);  
+					stream_INSTRUCTION_FORMAT12x_OR_ID.add(INSTRUCTION_FORMAT12x_OR_ID62);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 556:33: -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT12x_OR_ID62));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 20 :
+					// smaliParser.g:557:5: INSTRUCTION_FORMAT21c_FIELD
+					{
+					INSTRUCTION_FORMAT21c_FIELD63=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_simple_name1980);  
+					stream_INSTRUCTION_FORMAT21c_FIELD.add(INSTRUCTION_FORMAT21c_FIELD63);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 557:33: -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT21c_FIELD63));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 21 :
+					// smaliParser.g:558:5: INSTRUCTION_FORMAT21c_FIELD_ODEX
+					{
+					INSTRUCTION_FORMAT21c_FIELD_ODEX64=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_simple_name1991);  
+					stream_INSTRUCTION_FORMAT21c_FIELD_ODEX.add(INSTRUCTION_FORMAT21c_FIELD_ODEX64);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 558:38: -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT21c_FIELD_ODEX64));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 22 :
+					// smaliParser.g:559:5: INSTRUCTION_FORMAT21c_STRING
+					{
+					INSTRUCTION_FORMAT21c_STRING65=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_simple_name2002);  
+					stream_INSTRUCTION_FORMAT21c_STRING.add(INSTRUCTION_FORMAT21c_STRING65);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 559:34: -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT21c_STRING65));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 23 :
+					// smaliParser.g:560:5: INSTRUCTION_FORMAT21c_TYPE
+					{
+					INSTRUCTION_FORMAT21c_TYPE66=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_simple_name2013);  
+					stream_INSTRUCTION_FORMAT21c_TYPE.add(INSTRUCTION_FORMAT21c_TYPE66);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 560:32: -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT21c_TYPE66));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 24 :
+					// smaliParser.g:561:5: INSTRUCTION_FORMAT21t
+					{
+					INSTRUCTION_FORMAT21t67=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_simple_name2024);  
+					stream_INSTRUCTION_FORMAT21t.add(INSTRUCTION_FORMAT21t67);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 561:27: -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT21t67));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 25 :
+					// smaliParser.g:562:5: INSTRUCTION_FORMAT22c_FIELD
+					{
+					INSTRUCTION_FORMAT22c_FIELD68=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_simple_name2035);  
+					stream_INSTRUCTION_FORMAT22c_FIELD.add(INSTRUCTION_FORMAT22c_FIELD68);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 562:33: -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT22c_FIELD68));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 26 :
+					// smaliParser.g:563:5: INSTRUCTION_FORMAT22c_FIELD_ODEX
+					{
+					INSTRUCTION_FORMAT22c_FIELD_ODEX69=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_simple_name2046);  
+					stream_INSTRUCTION_FORMAT22c_FIELD_ODEX.add(INSTRUCTION_FORMAT22c_FIELD_ODEX69);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 563:38: -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT22c_FIELD_ODEX69));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 27 :
+					// smaliParser.g:564:5: INSTRUCTION_FORMAT22c_TYPE
+					{
+					INSTRUCTION_FORMAT22c_TYPE70=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_simple_name2057);  
+					stream_INSTRUCTION_FORMAT22c_TYPE.add(INSTRUCTION_FORMAT22c_TYPE70);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 564:32: -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT22c_TYPE70));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 28 :
+					// smaliParser.g:565:5: INSTRUCTION_FORMAT22cs_FIELD
+					{
+					INSTRUCTION_FORMAT22cs_FIELD71=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_simple_name2068);  
+					stream_INSTRUCTION_FORMAT22cs_FIELD.add(INSTRUCTION_FORMAT22cs_FIELD71);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 565:34: -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT22cs_FIELD71));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 29 :
+					// smaliParser.g:566:5: INSTRUCTION_FORMAT22s_OR_ID
+					{
+					INSTRUCTION_FORMAT22s_OR_ID72=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_simple_name2079);  
+					stream_INSTRUCTION_FORMAT22s_OR_ID.add(INSTRUCTION_FORMAT22s_OR_ID72);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 566:33: -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT22s_OR_ID72));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 30 :
+					// smaliParser.g:567:5: INSTRUCTION_FORMAT22t
+					{
+					INSTRUCTION_FORMAT22t73=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_simple_name2090);  
+					stream_INSTRUCTION_FORMAT22t.add(INSTRUCTION_FORMAT22t73);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 567:27: -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT22t73));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 31 :
+					// smaliParser.g:568:5: INSTRUCTION_FORMAT23x
+					{
+					INSTRUCTION_FORMAT23x74=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_simple_name2101);  
+					stream_INSTRUCTION_FORMAT23x.add(INSTRUCTION_FORMAT23x74);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 568:27: -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT23x74));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 32 :
+					// smaliParser.g:569:5: INSTRUCTION_FORMAT31i_OR_ID
+					{
+					INSTRUCTION_FORMAT31i_OR_ID75=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_simple_name2112);  
+					stream_INSTRUCTION_FORMAT31i_OR_ID.add(INSTRUCTION_FORMAT31i_OR_ID75);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 569:33: -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT31i_OR_ID75));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 33 :
+					// smaliParser.g:570:5: INSTRUCTION_FORMAT31t
+					{
+					INSTRUCTION_FORMAT31t76=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_simple_name2123);  
+					stream_INSTRUCTION_FORMAT31t.add(INSTRUCTION_FORMAT31t76);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 570:27: -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT31t76));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 34 :
+					// smaliParser.g:571:5: INSTRUCTION_FORMAT35c_METHOD
+					{
+					INSTRUCTION_FORMAT35c_METHOD77=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_simple_name2134);  
+					stream_INSTRUCTION_FORMAT35c_METHOD.add(INSTRUCTION_FORMAT35c_METHOD77);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 571:34: -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT35c_METHOD77));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 35 :
+					// smaliParser.g:572:5: INSTRUCTION_FORMAT35c_METHOD_ODEX
+					{
+					INSTRUCTION_FORMAT35c_METHOD_ODEX78=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_simple_name2145);  
+					stream_INSTRUCTION_FORMAT35c_METHOD_ODEX.add(INSTRUCTION_FORMAT35c_METHOD_ODEX78);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 572:39: -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT35c_METHOD_ODEX78));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 36 :
+					// smaliParser.g:573:5: INSTRUCTION_FORMAT35c_TYPE
+					{
+					INSTRUCTION_FORMAT35c_TYPE79=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_simple_name2156);  
+					stream_INSTRUCTION_FORMAT35c_TYPE.add(INSTRUCTION_FORMAT35c_TYPE79);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 573:32: -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT35c_TYPE79));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 37 :
+					// smaliParser.g:574:5: INSTRUCTION_FORMAT35mi_METHOD
+					{
+					INSTRUCTION_FORMAT35mi_METHOD80=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_simple_name2167);  
+					stream_INSTRUCTION_FORMAT35mi_METHOD.add(INSTRUCTION_FORMAT35mi_METHOD80);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 574:35: -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT35mi_METHOD80));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 38 :
+					// smaliParser.g:575:5: INSTRUCTION_FORMAT35ms_METHOD
+					{
+					INSTRUCTION_FORMAT35ms_METHOD81=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_simple_name2178);  
+					stream_INSTRUCTION_FORMAT35ms_METHOD.add(INSTRUCTION_FORMAT35ms_METHOD81);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 575:35: -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT35ms_METHOD81));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 39 :
+					// smaliParser.g:576:5: INSTRUCTION_FORMAT45cc_METHOD
+					{
+					INSTRUCTION_FORMAT45cc_METHOD82=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_simple_name2189);  
+					stream_INSTRUCTION_FORMAT45cc_METHOD.add(INSTRUCTION_FORMAT45cc_METHOD82);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 576:35: -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT45cc_METHOD82));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 40 :
+					// smaliParser.g:577:5: INSTRUCTION_FORMAT4rcc_METHOD
+					{
+					INSTRUCTION_FORMAT4rcc_METHOD83=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_simple_name2200);  
+					stream_INSTRUCTION_FORMAT4rcc_METHOD.add(INSTRUCTION_FORMAT4rcc_METHOD83);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 577:35: -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT4rcc_METHOD83));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 41 :
+					// smaliParser.g:578:5: INSTRUCTION_FORMAT51l
+					{
+					INSTRUCTION_FORMAT51l84=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_simple_name2211);  
+					stream_INSTRUCTION_FORMAT51l.add(INSTRUCTION_FORMAT51l84);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 578:27: -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, INSTRUCTION_FORMAT51l84));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "simple_name"
+
+
+	public static class member_name_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "member_name"
+	// smaliParser.g:580:1: member_name : ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] );
+	public final smaliParser.member_name_return member_name() throws RecognitionException {
+		smaliParser.member_name_return retval = new smaliParser.member_name_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token MEMBER_NAME86=null;
+		ParserRuleReturnScope simple_name85 =null;
+
+		CommonTree MEMBER_NAME86_tree=null;
+		RewriteRuleTokenStream stream_MEMBER_NAME=new RewriteRuleTokenStream(adaptor,"token MEMBER_NAME");
+
+		try {
+			// smaliParser.g:581:3: ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] )
+			int alt11=2;
+			int LA11_0 = input.LA(1);
+			if ( (LA11_0==ACCESS_SPEC||LA11_0==ANNOTATION_VISIBILITY||LA11_0==BOOL_LITERAL||LA11_0==DOUBLE_LITERAL_OR_ID||LA11_0==FLOAT_LITERAL_OR_ID||(LA11_0 >= INSTRUCTION_FORMAT10t && LA11_0 <= INSTRUCTION_FORMAT10x_ODEX)||LA11_0==INSTRUCTION_FORMAT11x||LA11_0==INSTRUCTION_FORMAT12x_OR_ID||(LA11_0 >= INSTRUCTION_FORMAT21c_FIELD && LA11_0 <= INSTRUCTION_FORMAT21c_TYPE)||LA11_0==INSTRUCTION_FORMAT21t||(LA11_0 >= INSTRUCTION_FORMAT22c_FIELD && LA11_0 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA11_0 >= INSTRUCTION_FORMAT22s_OR_ID && LA11_0 <= INSTRUCTION_FORMAT22t)||LA11_0==INSTRUCTION_FORMAT23x||(LA11_0 >= INSTRUCTION_FORMAT31i_OR_ID && LA11_0 <= INSTRUCTION_FORMAT31t)||(LA11_0 >= INSTRUCTION_FORMAT35c_METHOD && LA11_0 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA11_0 >= INSTRUCTION_FORMAT45cc_METHOD && LA11_0 <= INSTRUCTION_FORMAT51l)||(LA11_0 >= NEGATIVE_INTEGER_LITERAL && LA11_0 <= NULL_LITERAL)||(LA11_0 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA11_0 <= PRIMITIVE_TYPE)||LA11_0==REGISTER||LA11_0==SIMPLE_NAME||(LA11_0 >= VERIFICATION_ERROR_TYPE && LA11_0 <= VOID_TYPE)) ) {
+				alt11=1;
+			}
+			else if ( (LA11_0==MEMBER_NAME) ) {
+				alt11=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 11, 0, input);
+				throw nvae;
+			}
+
+			switch (alt11) {
+				case 1 :
+					// smaliParser.g:581:5: simple_name
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_simple_name_in_member_name2226);
+					simple_name85=simple_name();
+					state._fsp--;
+
+					adaptor.addChild(root_0, simple_name85.getTree());
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:582:5: MEMBER_NAME
+					{
+					MEMBER_NAME86=(Token)match(input,MEMBER_NAME,FOLLOW_MEMBER_NAME_in_member_name2232);  
+					stream_MEMBER_NAME.add(MEMBER_NAME86);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 582:17: -> SIMPLE_NAME[$MEMBER_NAME]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(SIMPLE_NAME, MEMBER_NAME86));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "member_name"
+
+
+	public static class method_prototype_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "method_prototype"
+	// smaliParser.g:584:1: method_prototype : OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) ;
+	public final smaliParser.method_prototype_return method_prototype() throws RecognitionException {
+		smaliParser.method_prototype_return retval = new smaliParser.method_prototype_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token OPEN_PAREN87=null;
+		Token CLOSE_PAREN89=null;
+		ParserRuleReturnScope param_list88 =null;
+		ParserRuleReturnScope type_descriptor90 =null;
+
+		CommonTree OPEN_PAREN87_tree=null;
+		CommonTree CLOSE_PAREN89_tree=null;
+		RewriteRuleTokenStream stream_OPEN_PAREN=new RewriteRuleTokenStream(adaptor,"token OPEN_PAREN");
+		RewriteRuleTokenStream stream_CLOSE_PAREN=new RewriteRuleTokenStream(adaptor,"token CLOSE_PAREN");
+		RewriteRuleSubtreeStream stream_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule type_descriptor");
+		RewriteRuleSubtreeStream stream_param_list=new RewriteRuleSubtreeStream(adaptor,"rule param_list");
+
+		try {
+			// smaliParser.g:585:3: ( OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) )
+			// smaliParser.g:585:5: OPEN_PAREN param_list CLOSE_PAREN type_descriptor
+			{
+			OPEN_PAREN87=(Token)match(input,OPEN_PAREN,FOLLOW_OPEN_PAREN_in_method_prototype2247);  
+			stream_OPEN_PAREN.add(OPEN_PAREN87);
+
+			pushFollow(FOLLOW_param_list_in_method_prototype2249);
+			param_list88=param_list();
+			state._fsp--;
+
+			stream_param_list.add(param_list88.getTree());
+			CLOSE_PAREN89=(Token)match(input,CLOSE_PAREN,FOLLOW_CLOSE_PAREN_in_method_prototype2251);  
+			stream_CLOSE_PAREN.add(CLOSE_PAREN89);
+
+			pushFollow(FOLLOW_type_descriptor_in_method_prototype2253);
+			type_descriptor90=type_descriptor();
+			state._fsp--;
+
+			stream_type_descriptor.add(type_descriptor90.getTree());
+			// AST REWRITE
+			// elements: type_descriptor, param_list
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 586:5: -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? )
+			{
+				// smaliParser.g:586:8: ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHOD_PROTOTYPE, (retval.start), "I_METHOD_PROTOTYPE"), root_1);
+				// smaliParser.g:586:59: ^( I_METHOD_RETURN_TYPE type_descriptor )
+				{
+				CommonTree root_2 = (CommonTree)adaptor.nil();
+				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHOD_RETURN_TYPE, "I_METHOD_RETURN_TYPE"), root_2);
+				adaptor.addChild(root_2, stream_type_descriptor.nextTree());
+				adaptor.addChild(root_1, root_2);
+				}
+
+				// smaliParser.g:586:99: ( param_list )?
+				if ( stream_param_list.hasNext() ) {
+					adaptor.addChild(root_1, stream_param_list.nextTree());
+				}
+				stream_param_list.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "method_prototype"
+
+
+	public static class param_list_or_id_primitive_type_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "param_list_or_id_primitive_type"
+	// smaliParser.g:588:1: param_list_or_id_primitive_type : PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] ;
+	public final smaliParser.param_list_or_id_primitive_type_return param_list_or_id_primitive_type() throws RecognitionException {
+		smaliParser.param_list_or_id_primitive_type_return retval = new smaliParser.param_list_or_id_primitive_type_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token PARAM_LIST_OR_ID_PRIMITIVE_TYPE91=null;
+
+		CommonTree PARAM_LIST_OR_ID_PRIMITIVE_TYPE91_tree=null;
+		RewriteRuleTokenStream stream_PARAM_LIST_OR_ID_PRIMITIVE_TYPE=new RewriteRuleTokenStream(adaptor,"token PARAM_LIST_OR_ID_PRIMITIVE_TYPE");
+
+		try {
+			// smaliParser.g:589:3: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] )
+			// smaliParser.g:589:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE
+			{
+			PARAM_LIST_OR_ID_PRIMITIVE_TYPE91=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id_primitive_type2283);  
+			stream_PARAM_LIST_OR_ID_PRIMITIVE_TYPE.add(PARAM_LIST_OR_ID_PRIMITIVE_TYPE91);
+
+			// AST REWRITE
+			// elements: 
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 589:37: -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE]
+			{
+				adaptor.addChild(root_0, (CommonTree)adaptor.create(PRIMITIVE_TYPE, PARAM_LIST_OR_ID_PRIMITIVE_TYPE91));
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "param_list_or_id_primitive_type"
+
+
+	public static class param_list_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "param_list"
+	// smaliParser.g:591:1: param_list : ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* );
+	public final smaliParser.param_list_return param_list() throws RecognitionException {
+		smaliParser.param_list_return retval = new smaliParser.param_list_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		ParserRuleReturnScope param_list_or_id_primitive_type92 =null;
+		ParserRuleReturnScope nonvoid_type_descriptor93 =null;
+
+
+		try {
+			// smaliParser.g:592:3: ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* )
+			int alt14=2;
+			int LA14_0 = input.LA(1);
+			if ( (LA14_0==PARAM_LIST_OR_ID_PRIMITIVE_TYPE) ) {
+				alt14=1;
+			}
+			else if ( (LA14_0==ARRAY_TYPE_PREFIX||LA14_0==CLASS_DESCRIPTOR||LA14_0==CLOSE_PAREN||LA14_0==PRIMITIVE_TYPE) ) {
+				alt14=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 14, 0, input);
+				throw nvae;
+			}
+
+			switch (alt14) {
+				case 1 :
+					// smaliParser.g:592:5: ( param_list_or_id_primitive_type )+
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					// smaliParser.g:592:5: ( param_list_or_id_primitive_type )+
+					int cnt12=0;
+					loop12:
+					while (true) {
+						int alt12=2;
+						int LA12_0 = input.LA(1);
+						if ( (LA12_0==PARAM_LIST_OR_ID_PRIMITIVE_TYPE) ) {
+							alt12=1;
+						}
+
+						switch (alt12) {
+						case 1 :
+							// smaliParser.g:592:5: param_list_or_id_primitive_type
+							{
+							pushFollow(FOLLOW_param_list_or_id_primitive_type_in_param_list2298);
+							param_list_or_id_primitive_type92=param_list_or_id_primitive_type();
+							state._fsp--;
+
+							adaptor.addChild(root_0, param_list_or_id_primitive_type92.getTree());
+
+							}
+							break;
+
+						default :
+							if ( cnt12 >= 1 ) break loop12;
+							EarlyExitException eee = new EarlyExitException(12, input);
+							throw eee;
+						}
+						cnt12++;
+					}
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:593:5: ( nonvoid_type_descriptor )*
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					// smaliParser.g:593:5: ( nonvoid_type_descriptor )*
+					loop13:
+					while (true) {
+						int alt13=2;
+						int LA13_0 = input.LA(1);
+						if ( (LA13_0==ARRAY_TYPE_PREFIX||LA13_0==CLASS_DESCRIPTOR||LA13_0==PRIMITIVE_TYPE) ) {
+							alt13=1;
+						}
+
+						switch (alt13) {
+						case 1 :
+							// smaliParser.g:593:5: nonvoid_type_descriptor
+							{
+							pushFollow(FOLLOW_nonvoid_type_descriptor_in_param_list2305);
+							nonvoid_type_descriptor93=nonvoid_type_descriptor();
+							state._fsp--;
+
+							adaptor.addChild(root_0, nonvoid_type_descriptor93.getTree());
+
+							}
+							break;
+
+						default :
+							break loop13;
+						}
+					}
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "param_list"
+
+
+	public static class array_descriptor_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "array_descriptor"
+	// smaliParser.g:595:1: array_descriptor : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ;
+	public final smaliParser.array_descriptor_return array_descriptor() throws RecognitionException {
+		smaliParser.array_descriptor_return retval = new smaliParser.array_descriptor_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token ARRAY_TYPE_PREFIX94=null;
+		Token set95=null;
+
+		CommonTree ARRAY_TYPE_PREFIX94_tree=null;
+		CommonTree set95_tree=null;
+
+		try {
+			// smaliParser.g:596:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) )
+			// smaliParser.g:596:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR )
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			ARRAY_TYPE_PREFIX94=(Token)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor2316); 
+			ARRAY_TYPE_PREFIX94_tree = (CommonTree)adaptor.create(ARRAY_TYPE_PREFIX94);
+			adaptor.addChild(root_0, ARRAY_TYPE_PREFIX94_tree);
+
+			set95=input.LT(1);
+			if ( input.LA(1)==CLASS_DESCRIPTOR||input.LA(1)==PRIMITIVE_TYPE ) {
+				input.consume();
+				adaptor.addChild(root_0, (CommonTree)adaptor.create(set95));
+				state.errorRecovery=false;
+			}
+			else {
+				MismatchedSetException mse = new MismatchedSetException(null,input);
+				throw mse;
+			}
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "array_descriptor"
+
+
+	public static class type_descriptor_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "type_descriptor"
+	// smaliParser.g:598:1: type_descriptor : ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor );
+	public final smaliParser.type_descriptor_return type_descriptor() throws RecognitionException {
+		smaliParser.type_descriptor_return retval = new smaliParser.type_descriptor_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token VOID_TYPE96=null;
+		Token PRIMITIVE_TYPE97=null;
+		Token CLASS_DESCRIPTOR98=null;
+		ParserRuleReturnScope array_descriptor99 =null;
+
+		CommonTree VOID_TYPE96_tree=null;
+		CommonTree PRIMITIVE_TYPE97_tree=null;
+		CommonTree CLASS_DESCRIPTOR98_tree=null;
+
+		try {
+			// smaliParser.g:599:3: ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
+			int alt15=4;
+			switch ( input.LA(1) ) {
+			case VOID_TYPE:
+				{
+				alt15=1;
+				}
+				break;
+			case PRIMITIVE_TYPE:
+				{
+				alt15=2;
+				}
+				break;
+			case CLASS_DESCRIPTOR:
+				{
+				alt15=3;
+				}
+				break;
+			case ARRAY_TYPE_PREFIX:
+				{
+				alt15=4;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 15, 0, input);
+				throw nvae;
+			}
+			switch (alt15) {
+				case 1 :
+					// smaliParser.g:599:5: VOID_TYPE
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					VOID_TYPE96=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor2334); 
+					VOID_TYPE96_tree = (CommonTree)adaptor.create(VOID_TYPE96);
+					adaptor.addChild(root_0, VOID_TYPE96_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:600:5: PRIMITIVE_TYPE
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					PRIMITIVE_TYPE97=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_descriptor2340); 
+					PRIMITIVE_TYPE97_tree = (CommonTree)adaptor.create(PRIMITIVE_TYPE97);
+					adaptor.addChild(root_0, PRIMITIVE_TYPE97_tree);
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:601:5: CLASS_DESCRIPTOR
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					CLASS_DESCRIPTOR98=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_type_descriptor2346); 
+					CLASS_DESCRIPTOR98_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR98);
+					adaptor.addChild(root_0, CLASS_DESCRIPTOR98_tree);
+
+					}
+					break;
+				case 4 :
+					// smaliParser.g:602:5: array_descriptor
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_array_descriptor_in_type_descriptor2352);
+					array_descriptor99=array_descriptor();
+					state._fsp--;
+
+					adaptor.addChild(root_0, array_descriptor99.getTree());
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "type_descriptor"
+
+
+	public static class nonvoid_type_descriptor_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "nonvoid_type_descriptor"
+	// smaliParser.g:604:1: nonvoid_type_descriptor : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor );
+	public final smaliParser.nonvoid_type_descriptor_return nonvoid_type_descriptor() throws RecognitionException {
+		smaliParser.nonvoid_type_descriptor_return retval = new smaliParser.nonvoid_type_descriptor_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token PRIMITIVE_TYPE100=null;
+		Token CLASS_DESCRIPTOR101=null;
+		ParserRuleReturnScope array_descriptor102 =null;
+
+		CommonTree PRIMITIVE_TYPE100_tree=null;
+		CommonTree CLASS_DESCRIPTOR101_tree=null;
+
+		try {
+			// smaliParser.g:605:3: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
+			int alt16=3;
+			switch ( input.LA(1) ) {
+			case PRIMITIVE_TYPE:
+				{
+				alt16=1;
+				}
+				break;
+			case CLASS_DESCRIPTOR:
+				{
+				alt16=2;
+				}
+				break;
+			case ARRAY_TYPE_PREFIX:
+				{
+				alt16=3;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 16, 0, input);
+				throw nvae;
+			}
+			switch (alt16) {
+				case 1 :
+					// smaliParser.g:605:5: PRIMITIVE_TYPE
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					PRIMITIVE_TYPE100=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor2362); 
+					PRIMITIVE_TYPE100_tree = (CommonTree)adaptor.create(PRIMITIVE_TYPE100);
+					adaptor.addChild(root_0, PRIMITIVE_TYPE100_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:606:5: CLASS_DESCRIPTOR
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					CLASS_DESCRIPTOR101=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor2368); 
+					CLASS_DESCRIPTOR101_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR101);
+					adaptor.addChild(root_0, CLASS_DESCRIPTOR101_tree);
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:607:5: array_descriptor
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_array_descriptor_in_nonvoid_type_descriptor2374);
+					array_descriptor102=array_descriptor();
+					state._fsp--;
+
+					adaptor.addChild(root_0, array_descriptor102.getTree());
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "nonvoid_type_descriptor"
+
+
+	public static class reference_type_descriptor_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "reference_type_descriptor"
+	// smaliParser.g:609:1: reference_type_descriptor : ( CLASS_DESCRIPTOR | array_descriptor );
+	public final smaliParser.reference_type_descriptor_return reference_type_descriptor() throws RecognitionException {
+		smaliParser.reference_type_descriptor_return retval = new smaliParser.reference_type_descriptor_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token CLASS_DESCRIPTOR103=null;
+		ParserRuleReturnScope array_descriptor104 =null;
+
+		CommonTree CLASS_DESCRIPTOR103_tree=null;
+
+		try {
+			// smaliParser.g:610:3: ( CLASS_DESCRIPTOR | array_descriptor )
+			int alt17=2;
+			int LA17_0 = input.LA(1);
+			if ( (LA17_0==CLASS_DESCRIPTOR) ) {
+				alt17=1;
+			}
+			else if ( (LA17_0==ARRAY_TYPE_PREFIX) ) {
+				alt17=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 17, 0, input);
+				throw nvae;
+			}
+
+			switch (alt17) {
+				case 1 :
+					// smaliParser.g:610:5: CLASS_DESCRIPTOR
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					CLASS_DESCRIPTOR103=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor2384); 
+					CLASS_DESCRIPTOR103_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR103);
+					adaptor.addChild(root_0, CLASS_DESCRIPTOR103_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:611:5: array_descriptor
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_array_descriptor_in_reference_type_descriptor2390);
+					array_descriptor104=array_descriptor();
+					state._fsp--;
+
+					adaptor.addChild(root_0, array_descriptor104.getTree());
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "reference_type_descriptor"
+
+
+	public static class integer_literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "integer_literal"
+	// smaliParser.g:613:1: integer_literal : ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] );
+	public final smaliParser.integer_literal_return integer_literal() throws RecognitionException {
+		smaliParser.integer_literal_return retval = new smaliParser.integer_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token POSITIVE_INTEGER_LITERAL105=null;
+		Token NEGATIVE_INTEGER_LITERAL106=null;
+
+		CommonTree POSITIVE_INTEGER_LITERAL105_tree=null;
+		CommonTree NEGATIVE_INTEGER_LITERAL106_tree=null;
+		RewriteRuleTokenStream stream_NEGATIVE_INTEGER_LITERAL=new RewriteRuleTokenStream(adaptor,"token NEGATIVE_INTEGER_LITERAL");
+		RewriteRuleTokenStream stream_POSITIVE_INTEGER_LITERAL=new RewriteRuleTokenStream(adaptor,"token POSITIVE_INTEGER_LITERAL");
+
+		try {
+			// smaliParser.g:614:3: ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] )
+			int alt18=2;
+			int LA18_0 = input.LA(1);
+			if ( (LA18_0==POSITIVE_INTEGER_LITERAL) ) {
+				alt18=1;
+			}
+			else if ( (LA18_0==NEGATIVE_INTEGER_LITERAL) ) {
+				alt18=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 18, 0, input);
+				throw nvae;
+			}
+
+			switch (alt18) {
+				case 1 :
+					// smaliParser.g:614:5: POSITIVE_INTEGER_LITERAL
+					{
+					POSITIVE_INTEGER_LITERAL105=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_integer_literal2400);  
+					stream_POSITIVE_INTEGER_LITERAL.add(POSITIVE_INTEGER_LITERAL105);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 614:30: -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(INTEGER_LITERAL, POSITIVE_INTEGER_LITERAL105));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:615:5: NEGATIVE_INTEGER_LITERAL
+					{
+					NEGATIVE_INTEGER_LITERAL106=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_integer_literal2411);  
+					stream_NEGATIVE_INTEGER_LITERAL.add(NEGATIVE_INTEGER_LITERAL106);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 615:30: -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(INTEGER_LITERAL, NEGATIVE_INTEGER_LITERAL106));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "integer_literal"
+
+
+	public static class float_literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "float_literal"
+	// smaliParser.g:617:1: float_literal : ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL );
+	public final smaliParser.float_literal_return float_literal() throws RecognitionException {
+		smaliParser.float_literal_return retval = new smaliParser.float_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token FLOAT_LITERAL_OR_ID107=null;
+		Token FLOAT_LITERAL108=null;
+
+		CommonTree FLOAT_LITERAL_OR_ID107_tree=null;
+		CommonTree FLOAT_LITERAL108_tree=null;
+		RewriteRuleTokenStream stream_FLOAT_LITERAL_OR_ID=new RewriteRuleTokenStream(adaptor,"token FLOAT_LITERAL_OR_ID");
+
+		try {
+			// smaliParser.g:618:3: ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL )
+			int alt19=2;
+			int LA19_0 = input.LA(1);
+			if ( (LA19_0==FLOAT_LITERAL_OR_ID) ) {
+				alt19=1;
+			}
+			else if ( (LA19_0==FLOAT_LITERAL) ) {
+				alt19=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 19, 0, input);
+				throw nvae;
+			}
+
+			switch (alt19) {
+				case 1 :
+					// smaliParser.g:618:5: FLOAT_LITERAL_OR_ID
+					{
+					FLOAT_LITERAL_OR_ID107=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_float_literal2426);  
+					stream_FLOAT_LITERAL_OR_ID.add(FLOAT_LITERAL_OR_ID107);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 618:25: -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(FLOAT_LITERAL, FLOAT_LITERAL_OR_ID107));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:619:5: FLOAT_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					FLOAT_LITERAL108=(Token)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal2437); 
+					FLOAT_LITERAL108_tree = (CommonTree)adaptor.create(FLOAT_LITERAL108);
+					adaptor.addChild(root_0, FLOAT_LITERAL108_tree);
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "float_literal"
+
+
+	public static class double_literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "double_literal"
+	// smaliParser.g:621:1: double_literal : ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL );
+	public final smaliParser.double_literal_return double_literal() throws RecognitionException {
+		smaliParser.double_literal_return retval = new smaliParser.double_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token DOUBLE_LITERAL_OR_ID109=null;
+		Token DOUBLE_LITERAL110=null;
+
+		CommonTree DOUBLE_LITERAL_OR_ID109_tree=null;
+		CommonTree DOUBLE_LITERAL110_tree=null;
+		RewriteRuleTokenStream stream_DOUBLE_LITERAL_OR_ID=new RewriteRuleTokenStream(adaptor,"token DOUBLE_LITERAL_OR_ID");
+
+		try {
+			// smaliParser.g:622:3: ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL )
+			int alt20=2;
+			int LA20_0 = input.LA(1);
+			if ( (LA20_0==DOUBLE_LITERAL_OR_ID) ) {
+				alt20=1;
+			}
+			else if ( (LA20_0==DOUBLE_LITERAL) ) {
+				alt20=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 20, 0, input);
+				throw nvae;
+			}
+
+			switch (alt20) {
+				case 1 :
+					// smaliParser.g:622:5: DOUBLE_LITERAL_OR_ID
+					{
+					DOUBLE_LITERAL_OR_ID109=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_double_literal2447);  
+					stream_DOUBLE_LITERAL_OR_ID.add(DOUBLE_LITERAL_OR_ID109);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 622:26: -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(DOUBLE_LITERAL, DOUBLE_LITERAL_OR_ID109));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:623:5: DOUBLE_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					DOUBLE_LITERAL110=(Token)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal2458); 
+					DOUBLE_LITERAL110_tree = (CommonTree)adaptor.create(DOUBLE_LITERAL110);
+					adaptor.addChild(root_0, DOUBLE_LITERAL110_tree);
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "double_literal"
+
+
+	public static class literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "literal"
+	// smaliParser.g:625:1: literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal );
+	public final smaliParser.literal_return literal() throws RecognitionException {
+		smaliParser.literal_return retval = new smaliParser.literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token LONG_LITERAL111=null;
+		Token SHORT_LITERAL113=null;
+		Token BYTE_LITERAL114=null;
+		Token CHAR_LITERAL117=null;
+		Token STRING_LITERAL118=null;
+		Token BOOL_LITERAL119=null;
+		Token NULL_LITERAL120=null;
+		ParserRuleReturnScope integer_literal112 =null;
+		ParserRuleReturnScope float_literal115 =null;
+		ParserRuleReturnScope double_literal116 =null;
+		ParserRuleReturnScope array_literal121 =null;
+		ParserRuleReturnScope subannotation122 =null;
+		ParserRuleReturnScope type_field_method_literal123 =null;
+		ParserRuleReturnScope enum_literal124 =null;
+
+		CommonTree LONG_LITERAL111_tree=null;
+		CommonTree SHORT_LITERAL113_tree=null;
+		CommonTree BYTE_LITERAL114_tree=null;
+		CommonTree CHAR_LITERAL117_tree=null;
+		CommonTree STRING_LITERAL118_tree=null;
+		CommonTree BOOL_LITERAL119_tree=null;
+		CommonTree NULL_LITERAL120_tree=null;
+
+		try {
+			// smaliParser.g:626:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal )
+			int alt21=14;
+			switch ( input.LA(1) ) {
+			case LONG_LITERAL:
+				{
+				alt21=1;
+				}
+				break;
+			case POSITIVE_INTEGER_LITERAL:
+				{
+				int LA21_2 = input.LA(2);
+				if ( (LA21_2==EOF||(LA21_2 >= ACCESS_SPEC && LA21_2 <= ANNOTATION_VISIBILITY)||LA21_2==BOOL_LITERAL||(LA21_2 >= CLASS_DIRECTIVE && LA21_2 <= CLOSE_BRACE)||LA21_2==COMMA||(LA21_2 >= DOUBLE_LITERAL_OR_ID && LA21_2 <= END_ANNOTATION_DIRECTIVE)||LA21_2==END_FIELD_DIRECTIVE||LA21_2==END_SUBANNOTATION_DIRECTIVE||LA21_2==FIELD_DIRECTIVE||(LA21_2 >= FLOAT_LITERAL_OR_ID && LA21_2 <= IMPLEMENTS_DIRECTIVE)||(LA21_2 >= INSTRUCTION_FORMAT10t && LA21_2 <= INSTRUCTION_FORMAT10x_ODEX)||LA21_2==INSTRUCTION_FORMAT11x||LA21_2==INSTRUCTION_FORMAT12x_OR_ID||(LA21_2 >= INSTRUCTION_FORMAT21c_FIELD && LA21_2 <= INSTRUCTION_FORMAT21c_TYPE)||LA21_2==INSTRUCTION_FORMAT21t||(LA21_2 >= INSTRUCTION_FORMAT22c_FIELD && LA21_2 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA21_2 >= INSTRUCTION_FORMAT22s_OR_ID && LA21_2 <= INSTRUCTION_FORMAT22t)||LA21_2==INSTRUCTION_FORMAT23x||(LA21_2 >= INSTRUCTION_FORMAT31i_OR_ID && LA21_2 <= INSTRUCTION_FORMAT31t)||(LA21_2 >= INSTRUCTION_FORMAT35c_METHOD && LA21_2 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA21_2 >= INSTRUCTION_FORMAT45cc_METHOD && LA21_2 <= INSTRUCTION_FORMAT51l)||(LA21_2 >= METHOD_DIRECTIVE && LA21_2 <= NULL_LITERAL)||(LA21_2 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA21_2 <= PRIMITIVE_TYPE)||LA21_2==REGISTER||(LA21_2 >= SIMPLE_NAME && LA21_2 <= SOURCE_DIRECTIVE)||(LA21_2 >= SUPER_DIRECTIVE && LA21_2 <= VOID_TYPE)) ) {
+					alt21=2;
+				}
+				else if ( (LA21_2==COLON||LA21_2==OPEN_PAREN) ) {
+					alt21=13;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 21, 2, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case NEGATIVE_INTEGER_LITERAL:
+				{
+				int LA21_3 = input.LA(2);
+				if ( (LA21_3==EOF||(LA21_3 >= ACCESS_SPEC && LA21_3 <= ANNOTATION_VISIBILITY)||LA21_3==BOOL_LITERAL||(LA21_3 >= CLASS_DIRECTIVE && LA21_3 <= CLOSE_BRACE)||LA21_3==COMMA||(LA21_3 >= DOUBLE_LITERAL_OR_ID && LA21_3 <= END_ANNOTATION_DIRECTIVE)||LA21_3==END_FIELD_DIRECTIVE||LA21_3==END_SUBANNOTATION_DIRECTIVE||LA21_3==FIELD_DIRECTIVE||(LA21_3 >= FLOAT_LITERAL_OR_ID && LA21_3 <= IMPLEMENTS_DIRECTIVE)||(LA21_3 >= INSTRUCTION_FORMAT10t && LA21_3 <= INSTRUCTION_FORMAT10x_ODEX)||LA21_3==INSTRUCTION_FORMAT11x||LA21_3==INSTRUCTION_FORMAT12x_OR_ID||(LA21_3 >= INSTRUCTION_FORMAT21c_FIELD && LA21_3 <= INSTRUCTION_FORMAT21c_TYPE)||LA21_3==INSTRUCTION_FORMAT21t||(LA21_3 >= INSTRUCTION_FORMAT22c_FIELD && LA21_3 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA21_3 >= INSTRUCTION_FORMAT22s_OR_ID && LA21_3 <= INSTRUCTION_FORMAT22t)||LA21_3==INSTRUCTION_FORMAT23x||(LA21_3 >= INSTRUCTION_FORMAT31i_OR_ID && LA21_3 <= INSTRUCTION_FORMAT31t)||(LA21_3 >= INSTRUCTION_FORMAT35c_METHOD && LA21_3 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA21_3 >= INSTRUCTION_FORMAT45cc_METHOD && LA21_3 <= INSTRUCTION_FORMAT51l)||(LA21_3 >= METHOD_DIRECTIVE && LA21_3 <= NULL_LITERAL)||(LA21_3 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA21_3 <= PRIMITIVE_TYPE)||LA21_3==REGISTER||(LA21_3 >= SIMPLE_NAME && LA21_3 <= SOURCE_DIRECTIVE)||(LA21_3 >= SUPER_DIRECTIVE && LA21_3 <= VOID_TYPE)) ) {
+					alt21=2;
+				}
+				else if ( (LA21_3==COLON||LA21_3==OPEN_PAREN) ) {
+					alt21=13;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 21, 3, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt21=3;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt21=4;
+				}
+				break;
+			case FLOAT_LITERAL_OR_ID:
+				{
+				int LA21_6 = input.LA(2);
+				if ( (LA21_6==EOF||(LA21_6 >= ACCESS_SPEC && LA21_6 <= ANNOTATION_VISIBILITY)||LA21_6==BOOL_LITERAL||(LA21_6 >= CLASS_DIRECTIVE && LA21_6 <= CLOSE_BRACE)||LA21_6==COMMA||(LA21_6 >= DOUBLE_LITERAL_OR_ID && LA21_6 <= END_ANNOTATION_DIRECTIVE)||LA21_6==END_FIELD_DIRECTIVE||LA21_6==END_SUBANNOTATION_DIRECTIVE||LA21_6==FIELD_DIRECTIVE||(LA21_6 >= FLOAT_LITERAL_OR_ID && LA21_6 <= IMPLEMENTS_DIRECTIVE)||(LA21_6 >= INSTRUCTION_FORMAT10t && LA21_6 <= INSTRUCTION_FORMAT10x_ODEX)||LA21_6==INSTRUCTION_FORMAT11x||LA21_6==INSTRUCTION_FORMAT12x_OR_ID||(LA21_6 >= INSTRUCTION_FORMAT21c_FIELD && LA21_6 <= INSTRUCTION_FORMAT21c_TYPE)||LA21_6==INSTRUCTION_FORMAT21t||(LA21_6 >= INSTRUCTION_FORMAT22c_FIELD && LA21_6 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA21_6 >= INSTRUCTION_FORMAT22s_OR_ID && LA21_6 <= INSTRUCTION_FORMAT22t)||LA21_6==INSTRUCTION_FORMAT23x||(LA21_6 >= INSTRUCTION_FORMAT31i_OR_ID && LA21_6 <= INSTRUCTION_FORMAT31t)||(LA21_6 >= INSTRUCTION_FORMAT35c_METHOD && LA21_6 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA21_6 >= INSTRUCTION_FORMAT45cc_METHOD && LA21_6 <= INSTRUCTION_FORMAT51l)||(LA21_6 >= METHOD_DIRECTIVE && LA21_6 <= NULL_LITERAL)||(LA21_6 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA21_6 <= PRIMITIVE_TYPE)||LA21_6==REGISTER||(LA21_6 >= SIMPLE_NAME && LA21_6 <= SOURCE_DIRECTIVE)||(LA21_6 >= SUPER_DIRECTIVE && LA21_6 <= VOID_TYPE)) ) {
+					alt21=5;
+				}
+				else if ( (LA21_6==COLON||LA21_6==OPEN_PAREN) ) {
+					alt21=13;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 21, 6, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case FLOAT_LITERAL:
+				{
+				alt21=5;
+				}
+				break;
+			case DOUBLE_LITERAL_OR_ID:
+				{
+				int LA21_8 = input.LA(2);
+				if ( (LA21_8==EOF||(LA21_8 >= ACCESS_SPEC && LA21_8 <= ANNOTATION_VISIBILITY)||LA21_8==BOOL_LITERAL||(LA21_8 >= CLASS_DIRECTIVE && LA21_8 <= CLOSE_BRACE)||LA21_8==COMMA||(LA21_8 >= DOUBLE_LITERAL_OR_ID && LA21_8 <= END_ANNOTATION_DIRECTIVE)||LA21_8==END_FIELD_DIRECTIVE||LA21_8==END_SUBANNOTATION_DIRECTIVE||LA21_8==FIELD_DIRECTIVE||(LA21_8 >= FLOAT_LITERAL_OR_ID && LA21_8 <= IMPLEMENTS_DIRECTIVE)||(LA21_8 >= INSTRUCTION_FORMAT10t && LA21_8 <= INSTRUCTION_FORMAT10x_ODEX)||LA21_8==INSTRUCTION_FORMAT11x||LA21_8==INSTRUCTION_FORMAT12x_OR_ID||(LA21_8 >= INSTRUCTION_FORMAT21c_FIELD && LA21_8 <= INSTRUCTION_FORMAT21c_TYPE)||LA21_8==INSTRUCTION_FORMAT21t||(LA21_8 >= INSTRUCTION_FORMAT22c_FIELD && LA21_8 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA21_8 >= INSTRUCTION_FORMAT22s_OR_ID && LA21_8 <= INSTRUCTION_FORMAT22t)||LA21_8==INSTRUCTION_FORMAT23x||(LA21_8 >= INSTRUCTION_FORMAT31i_OR_ID && LA21_8 <= INSTRUCTION_FORMAT31t)||(LA21_8 >= INSTRUCTION_FORMAT35c_METHOD && LA21_8 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA21_8 >= INSTRUCTION_FORMAT45cc_METHOD && LA21_8 <= INSTRUCTION_FORMAT51l)||(LA21_8 >= METHOD_DIRECTIVE && LA21_8 <= NULL_LITERAL)||(LA21_8 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA21_8 <= PRIMITIVE_TYPE)||LA21_8==REGISTER||(LA21_8 >= SIMPLE_NAME && LA21_8 <= SOURCE_DIRECTIVE)||(LA21_8 >= SUPER_DIRECTIVE && LA21_8 <= VOID_TYPE)) ) {
+					alt21=6;
+				}
+				else if ( (LA21_8==COLON||LA21_8==OPEN_PAREN) ) {
+					alt21=13;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 21, 8, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case DOUBLE_LITERAL:
+				{
+				alt21=6;
+				}
+				break;
+			case CHAR_LITERAL:
+				{
+				alt21=7;
+				}
+				break;
+			case STRING_LITERAL:
+				{
+				alt21=8;
+				}
+				break;
+			case BOOL_LITERAL:
+				{
+				int LA21_12 = input.LA(2);
+				if ( (LA21_12==EOF||(LA21_12 >= ACCESS_SPEC && LA21_12 <= ANNOTATION_VISIBILITY)||LA21_12==BOOL_LITERAL||(LA21_12 >= CLASS_DIRECTIVE && LA21_12 <= CLOSE_BRACE)||LA21_12==COMMA||(LA21_12 >= DOUBLE_LITERAL_OR_ID && LA21_12 <= END_ANNOTATION_DIRECTIVE)||LA21_12==END_FIELD_DIRECTIVE||LA21_12==END_SUBANNOTATION_DIRECTIVE||LA21_12==FIELD_DIRECTIVE||(LA21_12 >= FLOAT_LITERAL_OR_ID && LA21_12 <= IMPLEMENTS_DIRECTIVE)||(LA21_12 >= INSTRUCTION_FORMAT10t && LA21_12 <= INSTRUCTION_FORMAT10x_ODEX)||LA21_12==INSTRUCTION_FORMAT11x||LA21_12==INSTRUCTION_FORMAT12x_OR_ID||(LA21_12 >= INSTRUCTION_FORMAT21c_FIELD && LA21_12 <= INSTRUCTION_FORMAT21c_TYPE)||LA21_12==INSTRUCTION_FORMAT21t||(LA21_12 >= INSTRUCTION_FORMAT22c_FIELD && LA21_12 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA21_12 >= INSTRUCTION_FORMAT22s_OR_ID && LA21_12 <= INSTRUCTION_FORMAT22t)||LA21_12==INSTRUCTION_FORMAT23x||(LA21_12 >= INSTRUCTION_FORMAT31i_OR_ID && LA21_12 <= INSTRUCTION_FORMAT31t)||(LA21_12 >= INSTRUCTION_FORMAT35c_METHOD && LA21_12 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA21_12 >= INSTRUCTION_FORMAT45cc_METHOD && LA21_12 <= INSTRUCTION_FORMAT51l)||(LA21_12 >= METHOD_DIRECTIVE && LA21_12 <= NULL_LITERAL)||(LA21_12 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA21_12 <= PRIMITIVE_TYPE)||LA21_12==REGISTER||(LA21_12 >= SIMPLE_NAME && LA21_12 <= SOURCE_DIRECTIVE)||(LA21_12 >= SUPER_DIRECTIVE && LA21_12 <= VOID_TYPE)) ) {
+					alt21=9;
+				}
+				else if ( (LA21_12==COLON||LA21_12==OPEN_PAREN) ) {
+					alt21=13;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 21, 12, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case NULL_LITERAL:
+				{
+				int LA21_13 = input.LA(2);
+				if ( (LA21_13==EOF||(LA21_13 >= ACCESS_SPEC && LA21_13 <= ANNOTATION_VISIBILITY)||LA21_13==BOOL_LITERAL||(LA21_13 >= CLASS_DIRECTIVE && LA21_13 <= CLOSE_BRACE)||LA21_13==COMMA||(LA21_13 >= DOUBLE_LITERAL_OR_ID && LA21_13 <= END_ANNOTATION_DIRECTIVE)||LA21_13==END_FIELD_DIRECTIVE||LA21_13==END_SUBANNOTATION_DIRECTIVE||LA21_13==FIELD_DIRECTIVE||(LA21_13 >= FLOAT_LITERAL_OR_ID && LA21_13 <= IMPLEMENTS_DIRECTIVE)||(LA21_13 >= INSTRUCTION_FORMAT10t && LA21_13 <= INSTRUCTION_FORMAT10x_ODEX)||LA21_13==INSTRUCTION_FORMAT11x||LA21_13==INSTRUCTION_FORMAT12x_OR_ID||(LA21_13 >= INSTRUCTION_FORMAT21c_FIELD && LA21_13 <= INSTRUCTION_FORMAT21c_TYPE)||LA21_13==INSTRUCTION_FORMAT21t||(LA21_13 >= INSTRUCTION_FORMAT22c_FIELD && LA21_13 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA21_13 >= INSTRUCTION_FORMAT22s_OR_ID && LA21_13 <= INSTRUCTION_FORMAT22t)||LA21_13==INSTRUCTION_FORMAT23x||(LA21_13 >= INSTRUCTION_FORMAT31i_OR_ID && LA21_13 <= INSTRUCTION_FORMAT31t)||(LA21_13 >= INSTRUCTION_FORMAT35c_METHOD && LA21_13 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA21_13 >= INSTRUCTION_FORMAT45cc_METHOD && LA21_13 <= INSTRUCTION_FORMAT51l)||(LA21_13 >= METHOD_DIRECTIVE && LA21_13 <= NULL_LITERAL)||(LA21_13 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA21_13 <= PRIMITIVE_TYPE)||LA21_13==REGISTER||(LA21_13 >= SIMPLE_NAME && LA21_13 <= SOURCE_DIRECTIVE)||(LA21_13 >= SUPER_DIRECTIVE && LA21_13 <= VOID_TYPE)) ) {
+					alt21=10;
+				}
+				else if ( (LA21_13==COLON||LA21_13==OPEN_PAREN) ) {
+					alt21=13;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 21, 13, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case OPEN_BRACE:
+				{
+				alt21=11;
+				}
+				break;
+			case SUBANNOTATION_DIRECTIVE:
+				{
+				alt21=12;
+				}
+				break;
+			case ACCESS_SPEC:
+			case ANNOTATION_VISIBILITY:
+			case ARRAY_TYPE_PREFIX:
+			case CLASS_DESCRIPTOR:
+			case INSTRUCTION_FORMAT10t:
+			case INSTRUCTION_FORMAT10x:
+			case INSTRUCTION_FORMAT10x_ODEX:
+			case INSTRUCTION_FORMAT11x:
+			case INSTRUCTION_FORMAT12x_OR_ID:
+			case INSTRUCTION_FORMAT21c_FIELD:
+			case INSTRUCTION_FORMAT21c_FIELD_ODEX:
+			case INSTRUCTION_FORMAT21c_STRING:
+			case INSTRUCTION_FORMAT21c_TYPE:
+			case INSTRUCTION_FORMAT21t:
+			case INSTRUCTION_FORMAT22c_FIELD:
+			case INSTRUCTION_FORMAT22c_FIELD_ODEX:
+			case INSTRUCTION_FORMAT22c_TYPE:
+			case INSTRUCTION_FORMAT22cs_FIELD:
+			case INSTRUCTION_FORMAT22s_OR_ID:
+			case INSTRUCTION_FORMAT22t:
+			case INSTRUCTION_FORMAT23x:
+			case INSTRUCTION_FORMAT31i_OR_ID:
+			case INSTRUCTION_FORMAT31t:
+			case INSTRUCTION_FORMAT35c_METHOD:
+			case INSTRUCTION_FORMAT35c_METHOD_ODEX:
+			case INSTRUCTION_FORMAT35c_TYPE:
+			case INSTRUCTION_FORMAT35mi_METHOD:
+			case INSTRUCTION_FORMAT35ms_METHOD:
+			case INSTRUCTION_FORMAT45cc_METHOD:
+			case INSTRUCTION_FORMAT4rcc_METHOD:
+			case INSTRUCTION_FORMAT51l:
+			case MEMBER_NAME:
+			case PARAM_LIST_OR_ID_PRIMITIVE_TYPE:
+			case PRIMITIVE_TYPE:
+			case REGISTER:
+			case SIMPLE_NAME:
+			case VERIFICATION_ERROR_TYPE:
+			case VOID_TYPE:
+				{
+				alt21=13;
+				}
+				break;
+			case ENUM_DIRECTIVE:
+				{
+				alt21=14;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 21, 0, input);
+				throw nvae;
+			}
+			switch (alt21) {
+				case 1 :
+					// smaliParser.g:626:5: LONG_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					LONG_LITERAL111=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_literal2468); 
+					LONG_LITERAL111_tree = (CommonTree)adaptor.create(LONG_LITERAL111);
+					adaptor.addChild(root_0, LONG_LITERAL111_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:627:5: integer_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_integer_literal_in_literal2474);
+					integer_literal112=integer_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, integer_literal112.getTree());
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:628:5: SHORT_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					SHORT_LITERAL113=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_literal2480); 
+					SHORT_LITERAL113_tree = (CommonTree)adaptor.create(SHORT_LITERAL113);
+					adaptor.addChild(root_0, SHORT_LITERAL113_tree);
+
+					}
+					break;
+				case 4 :
+					// smaliParser.g:629:5: BYTE_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					BYTE_LITERAL114=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_literal2486); 
+					BYTE_LITERAL114_tree = (CommonTree)adaptor.create(BYTE_LITERAL114);
+					adaptor.addChild(root_0, BYTE_LITERAL114_tree);
+
+					}
+					break;
+				case 5 :
+					// smaliParser.g:630:5: float_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_float_literal_in_literal2492);
+					float_literal115=float_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, float_literal115.getTree());
+
+					}
+					break;
+				case 6 :
+					// smaliParser.g:631:5: double_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_double_literal_in_literal2498);
+					double_literal116=double_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, double_literal116.getTree());
+
+					}
+					break;
+				case 7 :
+					// smaliParser.g:632:5: CHAR_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					CHAR_LITERAL117=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_literal2504); 
+					CHAR_LITERAL117_tree = (CommonTree)adaptor.create(CHAR_LITERAL117);
+					adaptor.addChild(root_0, CHAR_LITERAL117_tree);
+
+					}
+					break;
+				case 8 :
+					// smaliParser.g:633:5: STRING_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					STRING_LITERAL118=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_literal2510); 
+					STRING_LITERAL118_tree = (CommonTree)adaptor.create(STRING_LITERAL118);
+					adaptor.addChild(root_0, STRING_LITERAL118_tree);
+
+					}
+					break;
+				case 9 :
+					// smaliParser.g:634:5: BOOL_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					BOOL_LITERAL119=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_literal2516); 
+					BOOL_LITERAL119_tree = (CommonTree)adaptor.create(BOOL_LITERAL119);
+					adaptor.addChild(root_0, BOOL_LITERAL119_tree);
+
+					}
+					break;
+				case 10 :
+					// smaliParser.g:635:5: NULL_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					NULL_LITERAL120=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal2522); 
+					NULL_LITERAL120_tree = (CommonTree)adaptor.create(NULL_LITERAL120);
+					adaptor.addChild(root_0, NULL_LITERAL120_tree);
+
+					}
+					break;
+				case 11 :
+					// smaliParser.g:636:5: array_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_array_literal_in_literal2528);
+					array_literal121=array_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, array_literal121.getTree());
+
+					}
+					break;
+				case 12 :
+					// smaliParser.g:637:5: subannotation
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_subannotation_in_literal2534);
+					subannotation122=subannotation();
+					state._fsp--;
+
+					adaptor.addChild(root_0, subannotation122.getTree());
+
+					}
+					break;
+				case 13 :
+					// smaliParser.g:638:5: type_field_method_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_type_field_method_literal_in_literal2540);
+					type_field_method_literal123=type_field_method_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, type_field_method_literal123.getTree());
+
+					}
+					break;
+				case 14 :
+					// smaliParser.g:639:5: enum_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_enum_literal_in_literal2546);
+					enum_literal124=enum_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, enum_literal124.getTree());
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "literal"
+
+
+	public static class parsed_integer_literal_return extends ParserRuleReturnScope {
+		public int value;
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "parsed_integer_literal"
+	// smaliParser.g:641:1: parsed_integer_literal returns [int value] : integer_literal ;
+	public final smaliParser.parsed_integer_literal_return parsed_integer_literal() throws RecognitionException {
+		smaliParser.parsed_integer_literal_return retval = new smaliParser.parsed_integer_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		ParserRuleReturnScope integer_literal125 =null;
+
+
+		try {
+			// smaliParser.g:642:3: ( integer_literal )
+			// smaliParser.g:642:5: integer_literal
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			pushFollow(FOLLOW_integer_literal_in_parsed_integer_literal2559);
+			integer_literal125=integer_literal();
+			state._fsp--;
+
+			adaptor.addChild(root_0, integer_literal125.getTree());
+
+			 retval.value = LiteralTools.parseInt((integer_literal125!=null?input.toString(integer_literal125.start,integer_literal125.stop):null)); 
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "parsed_integer_literal"
+
+
+	public static class integral_literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "integral_literal"
+	// smaliParser.g:644:1: integral_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL );
+	public final smaliParser.integral_literal_return integral_literal() throws RecognitionException {
+		smaliParser.integral_literal_return retval = new smaliParser.integral_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token LONG_LITERAL126=null;
+		Token SHORT_LITERAL128=null;
+		Token CHAR_LITERAL129=null;
+		Token BYTE_LITERAL130=null;
+		ParserRuleReturnScope integer_literal127 =null;
+
+		CommonTree LONG_LITERAL126_tree=null;
+		CommonTree SHORT_LITERAL128_tree=null;
+		CommonTree CHAR_LITERAL129_tree=null;
+		CommonTree BYTE_LITERAL130_tree=null;
+
+		try {
+			// smaliParser.g:645:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL )
+			int alt22=5;
+			switch ( input.LA(1) ) {
+			case LONG_LITERAL:
+				{
+				alt22=1;
+				}
+				break;
+			case NEGATIVE_INTEGER_LITERAL:
+			case POSITIVE_INTEGER_LITERAL:
+				{
+				alt22=2;
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt22=3;
+				}
+				break;
+			case CHAR_LITERAL:
+				{
+				alt22=4;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt22=5;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 22, 0, input);
+				throw nvae;
+			}
+			switch (alt22) {
+				case 1 :
+					// smaliParser.g:645:5: LONG_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					LONG_LITERAL126=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_integral_literal2571); 
+					LONG_LITERAL126_tree = (CommonTree)adaptor.create(LONG_LITERAL126);
+					adaptor.addChild(root_0, LONG_LITERAL126_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:646:5: integer_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_integer_literal_in_integral_literal2577);
+					integer_literal127=integer_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, integer_literal127.getTree());
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:647:5: SHORT_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					SHORT_LITERAL128=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_integral_literal2583); 
+					SHORT_LITERAL128_tree = (CommonTree)adaptor.create(SHORT_LITERAL128);
+					adaptor.addChild(root_0, SHORT_LITERAL128_tree);
+
+					}
+					break;
+				case 4 :
+					// smaliParser.g:648:5: CHAR_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					CHAR_LITERAL129=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_integral_literal2589); 
+					CHAR_LITERAL129_tree = (CommonTree)adaptor.create(CHAR_LITERAL129);
+					adaptor.addChild(root_0, CHAR_LITERAL129_tree);
+
+					}
+					break;
+				case 5 :
+					// smaliParser.g:649:5: BYTE_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					BYTE_LITERAL130=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_integral_literal2595); 
+					BYTE_LITERAL130_tree = (CommonTree)adaptor.create(BYTE_LITERAL130);
+					adaptor.addChild(root_0, BYTE_LITERAL130_tree);
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "integral_literal"
+
+
+	public static class fixed_32bit_literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "fixed_32bit_literal"
+	// smaliParser.g:651:1: fixed_32bit_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL );
+	public final smaliParser.fixed_32bit_literal_return fixed_32bit_literal() throws RecognitionException {
+		smaliParser.fixed_32bit_literal_return retval = new smaliParser.fixed_32bit_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token LONG_LITERAL131=null;
+		Token SHORT_LITERAL133=null;
+		Token BYTE_LITERAL134=null;
+		Token CHAR_LITERAL136=null;
+		Token BOOL_LITERAL137=null;
+		ParserRuleReturnScope integer_literal132 =null;
+		ParserRuleReturnScope float_literal135 =null;
+
+		CommonTree LONG_LITERAL131_tree=null;
+		CommonTree SHORT_LITERAL133_tree=null;
+		CommonTree BYTE_LITERAL134_tree=null;
+		CommonTree CHAR_LITERAL136_tree=null;
+		CommonTree BOOL_LITERAL137_tree=null;
+
+		try {
+			// smaliParser.g:652:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL )
+			int alt23=7;
+			switch ( input.LA(1) ) {
+			case LONG_LITERAL:
+				{
+				alt23=1;
+				}
+				break;
+			case NEGATIVE_INTEGER_LITERAL:
+			case POSITIVE_INTEGER_LITERAL:
+				{
+				alt23=2;
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt23=3;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt23=4;
+				}
+				break;
+			case FLOAT_LITERAL:
+			case FLOAT_LITERAL_OR_ID:
+				{
+				alt23=5;
+				}
+				break;
+			case CHAR_LITERAL:
+				{
+				alt23=6;
+				}
+				break;
+			case BOOL_LITERAL:
+				{
+				alt23=7;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 23, 0, input);
+				throw nvae;
+			}
+			switch (alt23) {
+				case 1 :
+					// smaliParser.g:652:5: LONG_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					LONG_LITERAL131=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_32bit_literal2605); 
+					LONG_LITERAL131_tree = (CommonTree)adaptor.create(LONG_LITERAL131);
+					adaptor.addChild(root_0, LONG_LITERAL131_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:653:5: integer_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_integer_literal_in_fixed_32bit_literal2611);
+					integer_literal132=integer_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, integer_literal132.getTree());
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:654:5: SHORT_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					SHORT_LITERAL133=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_32bit_literal2617); 
+					SHORT_LITERAL133_tree = (CommonTree)adaptor.create(SHORT_LITERAL133);
+					adaptor.addChild(root_0, SHORT_LITERAL133_tree);
+
+					}
+					break;
+				case 4 :
+					// smaliParser.g:655:5: BYTE_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					BYTE_LITERAL134=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_32bit_literal2623); 
+					BYTE_LITERAL134_tree = (CommonTree)adaptor.create(BYTE_LITERAL134);
+					adaptor.addChild(root_0, BYTE_LITERAL134_tree);
+
+					}
+					break;
+				case 5 :
+					// smaliParser.g:656:5: float_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_float_literal_in_fixed_32bit_literal2629);
+					float_literal135=float_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, float_literal135.getTree());
+
+					}
+					break;
+				case 6 :
+					// smaliParser.g:657:5: CHAR_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					CHAR_LITERAL136=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_32bit_literal2635); 
+					CHAR_LITERAL136_tree = (CommonTree)adaptor.create(CHAR_LITERAL136);
+					adaptor.addChild(root_0, CHAR_LITERAL136_tree);
+
+					}
+					break;
+				case 7 :
+					// smaliParser.g:658:5: BOOL_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					BOOL_LITERAL137=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_32bit_literal2641); 
+					BOOL_LITERAL137_tree = (CommonTree)adaptor.create(BOOL_LITERAL137);
+					adaptor.addChild(root_0, BOOL_LITERAL137_tree);
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "fixed_32bit_literal"
+
+
+	public static class fixed_literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "fixed_literal"
+	// smaliParser.g:660:1: fixed_literal : ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL );
+	public final smaliParser.fixed_literal_return fixed_literal() throws RecognitionException {
+		smaliParser.fixed_literal_return retval = new smaliParser.fixed_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token LONG_LITERAL139=null;
+		Token SHORT_LITERAL140=null;
+		Token BYTE_LITERAL141=null;
+		Token CHAR_LITERAL144=null;
+		Token BOOL_LITERAL145=null;
+		ParserRuleReturnScope integer_literal138 =null;
+		ParserRuleReturnScope float_literal142 =null;
+		ParserRuleReturnScope double_literal143 =null;
+
+		CommonTree LONG_LITERAL139_tree=null;
+		CommonTree SHORT_LITERAL140_tree=null;
+		CommonTree BYTE_LITERAL141_tree=null;
+		CommonTree CHAR_LITERAL144_tree=null;
+		CommonTree BOOL_LITERAL145_tree=null;
+
+		try {
+			// smaliParser.g:661:3: ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL )
+			int alt24=8;
+			switch ( input.LA(1) ) {
+			case NEGATIVE_INTEGER_LITERAL:
+			case POSITIVE_INTEGER_LITERAL:
+				{
+				alt24=1;
+				}
+				break;
+			case LONG_LITERAL:
+				{
+				alt24=2;
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt24=3;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt24=4;
+				}
+				break;
+			case FLOAT_LITERAL:
+			case FLOAT_LITERAL_OR_ID:
+				{
+				alt24=5;
+				}
+				break;
+			case DOUBLE_LITERAL:
+			case DOUBLE_LITERAL_OR_ID:
+				{
+				alt24=6;
+				}
+				break;
+			case CHAR_LITERAL:
+				{
+				alt24=7;
+				}
+				break;
+			case BOOL_LITERAL:
+				{
+				alt24=8;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 24, 0, input);
+				throw nvae;
+			}
+			switch (alt24) {
+				case 1 :
+					// smaliParser.g:661:5: integer_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_integer_literal_in_fixed_literal2651);
+					integer_literal138=integer_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, integer_literal138.getTree());
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:662:5: LONG_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					LONG_LITERAL139=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_literal2657); 
+					LONG_LITERAL139_tree = (CommonTree)adaptor.create(LONG_LITERAL139);
+					adaptor.addChild(root_0, LONG_LITERAL139_tree);
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:663:5: SHORT_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					SHORT_LITERAL140=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_literal2663); 
+					SHORT_LITERAL140_tree = (CommonTree)adaptor.create(SHORT_LITERAL140);
+					adaptor.addChild(root_0, SHORT_LITERAL140_tree);
+
+					}
+					break;
+				case 4 :
+					// smaliParser.g:664:5: BYTE_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					BYTE_LITERAL141=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_literal2669); 
+					BYTE_LITERAL141_tree = (CommonTree)adaptor.create(BYTE_LITERAL141);
+					adaptor.addChild(root_0, BYTE_LITERAL141_tree);
+
+					}
+					break;
+				case 5 :
+					// smaliParser.g:665:5: float_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_float_literal_in_fixed_literal2675);
+					float_literal142=float_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, float_literal142.getTree());
+
+					}
+					break;
+				case 6 :
+					// smaliParser.g:666:5: double_literal
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_double_literal_in_fixed_literal2681);
+					double_literal143=double_literal();
+					state._fsp--;
+
+					adaptor.addChild(root_0, double_literal143.getTree());
+
+					}
+					break;
+				case 7 :
+					// smaliParser.g:667:5: CHAR_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					CHAR_LITERAL144=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_literal2687); 
+					CHAR_LITERAL144_tree = (CommonTree)adaptor.create(CHAR_LITERAL144);
+					adaptor.addChild(root_0, CHAR_LITERAL144_tree);
+
+					}
+					break;
+				case 8 :
+					// smaliParser.g:668:5: BOOL_LITERAL
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					BOOL_LITERAL145=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_literal2693); 
+					BOOL_LITERAL145_tree = (CommonTree)adaptor.create(BOOL_LITERAL145);
+					adaptor.addChild(root_0, BOOL_LITERAL145_tree);
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "fixed_literal"
+
+
+	public static class array_literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "array_literal"
+	// smaliParser.g:670:1: array_literal : OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) ;
+	public final smaliParser.array_literal_return array_literal() throws RecognitionException {
+		smaliParser.array_literal_return retval = new smaliParser.array_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token OPEN_BRACE146=null;
+		Token COMMA148=null;
+		Token CLOSE_BRACE150=null;
+		ParserRuleReturnScope literal147 =null;
+		ParserRuleReturnScope literal149 =null;
+
+		CommonTree OPEN_BRACE146_tree=null;
+		CommonTree COMMA148_tree=null;
+		CommonTree CLOSE_BRACE150_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_OPEN_BRACE=new RewriteRuleTokenStream(adaptor,"token OPEN_BRACE");
+		RewriteRuleTokenStream stream_CLOSE_BRACE=new RewriteRuleTokenStream(adaptor,"token CLOSE_BRACE");
+		RewriteRuleSubtreeStream stream_literal=new RewriteRuleSubtreeStream(adaptor,"rule literal");
+
+		try {
+			// smaliParser.g:671:3: ( OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) )
+			// smaliParser.g:671:5: OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE
+			{
+			OPEN_BRACE146=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_array_literal2703);  
+			stream_OPEN_BRACE.add(OPEN_BRACE146);
+
+			// smaliParser.g:671:16: ( literal ( COMMA literal )* |)
+			int alt26=2;
+			int LA26_0 = input.LA(1);
+			if ( (LA26_0==ACCESS_SPEC||LA26_0==ANNOTATION_VISIBILITY||LA26_0==ARRAY_TYPE_PREFIX||(LA26_0 >= BOOL_LITERAL && LA26_0 <= BYTE_LITERAL)||(LA26_0 >= CHAR_LITERAL && LA26_0 <= CLASS_DESCRIPTOR)||(LA26_0 >= DOUBLE_LITERAL && LA26_0 <= DOUBLE_LITERAL_OR_ID)||LA26_0==ENUM_DIRECTIVE||(LA26_0 >= FLOAT_LITERAL && LA26_0 <= FLOAT_LITERAL_OR_ID)||(LA26_0 >= INSTRUCTION_FORMAT10t && LA26_0 <= INSTRUCTION_FORMAT10x_ODEX)||LA26_0==INSTRUCTION_FORMAT11x||LA26_0==INSTRUCTION_FORMAT12x_OR_ID||(LA26_0 >= INSTRUCTION_FORMAT21c_FIELD && LA26_0 <= INSTRUCTION_FORMAT21c_TYPE)||LA26_0==INSTRUCTION_FORMAT21t||(LA26_0 >= INSTRUCTION_FORMAT22c_FIELD && LA26_0 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA26_0 >= INSTRUCTION_FORMAT22s_OR_ID && LA26_0 <= INSTRUCTION_FORMAT22t)||LA26_0==INSTRUCTION_FORMAT23x||(LA26_0 >= INSTRUCTION_FORMAT31i_OR_ID && LA26_0 <= INSTRUCTION_FORMAT31t)||(LA26_0 >= INSTRUCTION_FORMAT35c_METHOD && LA26_0 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA26_0 >= INSTRUCTION_FORMAT45cc_METHOD && LA26_0 <= INSTRUCTION_FORMAT51l)||(LA26_0 >= LONG_LITERAL && LA26_0 <= MEMBER_NAME)||(LA26_0 >= NEGATIVE_INTEGER_LITERAL && LA26_0 <= OPEN_BRACE)||(LA26_0 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA26_0 <= PRIMITIVE_TYPE)||LA26_0==REGISTER||(LA26_0 >= SHORT_LITERAL && LA26_0 <= SIMPLE_NAME)||(LA26_0 >= STRING_LITERAL && LA26_0 <= SUBANNOTATION_DIRECTIVE)||(LA26_0 >= VERIFICATION_ERROR_TYPE && LA26_0 <= VOID_TYPE)) ) {
+				alt26=1;
+			}
+			else if ( (LA26_0==CLOSE_BRACE) ) {
+				alt26=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 26, 0, input);
+				throw nvae;
+			}
+
+			switch (alt26) {
+				case 1 :
+					// smaliParser.g:671:17: literal ( COMMA literal )*
+					{
+					pushFollow(FOLLOW_literal_in_array_literal2706);
+					literal147=literal();
+					state._fsp--;
+
+					stream_literal.add(literal147.getTree());
+					// smaliParser.g:671:25: ( COMMA literal )*
+					loop25:
+					while (true) {
+						int alt25=2;
+						int LA25_0 = input.LA(1);
+						if ( (LA25_0==COMMA) ) {
+							alt25=1;
+						}
+
+						switch (alt25) {
+						case 1 :
+							// smaliParser.g:671:26: COMMA literal
+							{
+							COMMA148=(Token)match(input,COMMA,FOLLOW_COMMA_in_array_literal2709);  
+							stream_COMMA.add(COMMA148);
+
+							pushFollow(FOLLOW_literal_in_array_literal2711);
+							literal149=literal();
+							state._fsp--;
+
+							stream_literal.add(literal149.getTree());
+							}
+							break;
+
+						default :
+							break loop25;
+						}
+					}
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:671:44: 
+					{
+					}
+					break;
+
+			}
+
+			CLOSE_BRACE150=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_array_literal2719);  
+			stream_CLOSE_BRACE.add(CLOSE_BRACE150);
+
+			// AST REWRITE
+			// elements: literal
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 672:5: -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* )
+			{
+				// smaliParser.g:672:8: ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_ARRAY, (retval.start), "I_ENCODED_ARRAY"), root_1);
+				// smaliParser.g:672:53: ( literal )*
+				while ( stream_literal.hasNext() ) {
+					adaptor.addChild(root_1, stream_literal.nextTree());
+				}
+				stream_literal.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "array_literal"
+
+
+	public static class annotation_element_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "annotation_element"
+	// smaliParser.g:674:1: annotation_element : simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) ;
+	public final smaliParser.annotation_element_return annotation_element() throws RecognitionException {
+		smaliParser.annotation_element_return retval = new smaliParser.annotation_element_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token EQUAL152=null;
+		ParserRuleReturnScope simple_name151 =null;
+		ParserRuleReturnScope literal153 =null;
+
+		CommonTree EQUAL152_tree=null;
+		RewriteRuleTokenStream stream_EQUAL=new RewriteRuleTokenStream(adaptor,"token EQUAL");
+		RewriteRuleSubtreeStream stream_simple_name=new RewriteRuleSubtreeStream(adaptor,"rule simple_name");
+		RewriteRuleSubtreeStream stream_literal=new RewriteRuleSubtreeStream(adaptor,"rule literal");
+
+		try {
+			// smaliParser.g:675:3: ( simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) )
+			// smaliParser.g:675:5: simple_name EQUAL literal
+			{
+			pushFollow(FOLLOW_simple_name_in_annotation_element2743);
+			simple_name151=simple_name();
+			state._fsp--;
+
+			stream_simple_name.add(simple_name151.getTree());
+			EQUAL152=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_annotation_element2745);  
+			stream_EQUAL.add(EQUAL152);
+
+			pushFollow(FOLLOW_literal_in_annotation_element2747);
+			literal153=literal();
+			state._fsp--;
+
+			stream_literal.add(literal153.getTree());
+			// AST REWRITE
+			// elements: simple_name, literal
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 676:5: -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal )
+			{
+				// smaliParser.g:676:8: ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATION_ELEMENT, (retval.start), "I_ANNOTATION_ELEMENT"), root_1);
+				adaptor.addChild(root_1, stream_simple_name.nextTree());
+				adaptor.addChild(root_1, stream_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "annotation_element"
+
+
+	public static class annotation_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "annotation"
+	// smaliParser.g:678:1: annotation : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) ;
+	public final smaliParser.annotation_return annotation() throws RecognitionException {
+		smaliParser.annotation_return retval = new smaliParser.annotation_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token ANNOTATION_DIRECTIVE154=null;
+		Token ANNOTATION_VISIBILITY155=null;
+		Token CLASS_DESCRIPTOR156=null;
+		Token END_ANNOTATION_DIRECTIVE158=null;
+		ParserRuleReturnScope annotation_element157 =null;
+
+		CommonTree ANNOTATION_DIRECTIVE154_tree=null;
+		CommonTree ANNOTATION_VISIBILITY155_tree=null;
+		CommonTree CLASS_DESCRIPTOR156_tree=null;
+		CommonTree END_ANNOTATION_DIRECTIVE158_tree=null;
+		RewriteRuleTokenStream stream_ANNOTATION_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token ANNOTATION_DIRECTIVE");
+		RewriteRuleTokenStream stream_ANNOTATION_VISIBILITY=new RewriteRuleTokenStream(adaptor,"token ANNOTATION_VISIBILITY");
+		RewriteRuleTokenStream stream_CLASS_DESCRIPTOR=new RewriteRuleTokenStream(adaptor,"token CLASS_DESCRIPTOR");
+		RewriteRuleTokenStream stream_END_ANNOTATION_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_ANNOTATION_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_annotation_element=new RewriteRuleSubtreeStream(adaptor,"rule annotation_element");
+
+		try {
+			// smaliParser.g:679:3: ( ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) )
+			// smaliParser.g:679:5: ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE
+			{
+			ANNOTATION_DIRECTIVE154=(Token)match(input,ANNOTATION_DIRECTIVE,FOLLOW_ANNOTATION_DIRECTIVE_in_annotation2772);  
+			stream_ANNOTATION_DIRECTIVE.add(ANNOTATION_DIRECTIVE154);
+
+			ANNOTATION_VISIBILITY155=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation2774);  
+			stream_ANNOTATION_VISIBILITY.add(ANNOTATION_VISIBILITY155);
+
+			CLASS_DESCRIPTOR156=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_annotation2776);  
+			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR156);
+
+			// smaliParser.g:680:5: ( annotation_element )*
+			loop27:
+			while (true) {
+				int alt27=2;
+				int LA27_0 = input.LA(1);
+				if ( (LA27_0==ACCESS_SPEC||LA27_0==ANNOTATION_VISIBILITY||LA27_0==BOOL_LITERAL||LA27_0==DOUBLE_LITERAL_OR_ID||LA27_0==FLOAT_LITERAL_OR_ID||(LA27_0 >= INSTRUCTION_FORMAT10t && LA27_0 <= INSTRUCTION_FORMAT10x_ODEX)||LA27_0==INSTRUCTION_FORMAT11x||LA27_0==INSTRUCTION_FORMAT12x_OR_ID||(LA27_0 >= INSTRUCTION_FORMAT21c_FIELD && LA27_0 <= INSTRUCTION_FORMAT21c_TYPE)||LA27_0==INSTRUCTION_FORMAT21t||(LA27_0 >= INSTRUCTION_FORMAT22c_FIELD && LA27_0 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA27_0 >= INSTRUCTION_FORMAT22s_OR_ID && LA27_0 <= INSTRUCTION_FORMAT22t)||LA27_0==INSTRUCTION_FORMAT23x||(LA27_0 >= INSTRUCTION_FORMAT31i_OR_ID && LA27_0 <= INSTRUCTION_FORMAT31t)||(LA27_0 >= INSTRUCTION_FORMAT35c_METHOD && LA27_0 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA27_0 >= INSTRUCTION_FORMAT45cc_METHOD && LA27_0 <= INSTRUCTION_FORMAT51l)||(LA27_0 >= NEGATIVE_INTEGER_LITERAL && LA27_0 <= NULL_LITERAL)||(LA27_0 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA27_0 <= PRIMITIVE_TYPE)||LA27_0==REGISTER||LA27_0==SIMPLE_NAME||(LA27_0 >= VERIFICATION_ERROR_TYPE && LA27_0 <= VOID_TYPE)) ) {
+					alt27=1;
+				}
+
+				switch (alt27) {
+				case 1 :
+					// smaliParser.g:680:5: annotation_element
+					{
+					pushFollow(FOLLOW_annotation_element_in_annotation2782);
+					annotation_element157=annotation_element();
+					state._fsp--;
+
+					stream_annotation_element.add(annotation_element157.getTree());
+					}
+					break;
+
+				default :
+					break loop27;
+				}
+			}
+
+			END_ANNOTATION_DIRECTIVE158=(Token)match(input,END_ANNOTATION_DIRECTIVE,FOLLOW_END_ANNOTATION_DIRECTIVE_in_annotation2785);  
+			stream_END_ANNOTATION_DIRECTIVE.add(END_ANNOTATION_DIRECTIVE158);
+
+			// AST REWRITE
+			// elements: CLASS_DESCRIPTOR, annotation_element, ANNOTATION_VISIBILITY
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 681:5: -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) )
+			{
+				// smaliParser.g:681:8: ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATION, (retval.start), "I_ANNOTATION"), root_1);
+				adaptor.addChild(root_1, stream_ANNOTATION_VISIBILITY.nextNode());
+				// smaliParser.g:681:69: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* )
+				{
+				CommonTree root_2 = (CommonTree)adaptor.nil();
+				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SUBANNOTATION, (retval.start), "I_SUBANNOTATION"), root_2);
+				adaptor.addChild(root_2, stream_CLASS_DESCRIPTOR.nextNode());
+				// smaliParser.g:681:131: ( annotation_element )*
+				while ( stream_annotation_element.hasNext() ) {
+					adaptor.addChild(root_2, stream_annotation_element.nextTree());
+				}
+				stream_annotation_element.reset();
+
+				adaptor.addChild(root_1, root_2);
+				}
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "annotation"
+
+
+	public static class subannotation_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "subannotation"
+	// smaliParser.g:683:1: subannotation : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ;
+	public final smaliParser.subannotation_return subannotation() throws RecognitionException {
+		smaliParser.subannotation_return retval = new smaliParser.subannotation_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token SUBANNOTATION_DIRECTIVE159=null;
+		Token CLASS_DESCRIPTOR160=null;
+		Token END_SUBANNOTATION_DIRECTIVE162=null;
+		ParserRuleReturnScope annotation_element161 =null;
+
+		CommonTree SUBANNOTATION_DIRECTIVE159_tree=null;
+		CommonTree CLASS_DESCRIPTOR160_tree=null;
+		CommonTree END_SUBANNOTATION_DIRECTIVE162_tree=null;
+		RewriteRuleTokenStream stream_SUBANNOTATION_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token SUBANNOTATION_DIRECTIVE");
+		RewriteRuleTokenStream stream_CLASS_DESCRIPTOR=new RewriteRuleTokenStream(adaptor,"token CLASS_DESCRIPTOR");
+		RewriteRuleTokenStream stream_END_SUBANNOTATION_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_SUBANNOTATION_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_annotation_element=new RewriteRuleSubtreeStream(adaptor,"rule annotation_element");
+
+		try {
+			// smaliParser.g:684:3: ( SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) )
+			// smaliParser.g:684:5: SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE
+			{
+			SUBANNOTATION_DIRECTIVE159=(Token)match(input,SUBANNOTATION_DIRECTIVE,FOLLOW_SUBANNOTATION_DIRECTIVE_in_subannotation2818);  
+			stream_SUBANNOTATION_DIRECTIVE.add(SUBANNOTATION_DIRECTIVE159);
+
+			CLASS_DESCRIPTOR160=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation2820);  
+			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR160);
+
+			// smaliParser.g:684:46: ( annotation_element )*
+			loop28:
+			while (true) {
+				int alt28=2;
+				int LA28_0 = input.LA(1);
+				if ( (LA28_0==ACCESS_SPEC||LA28_0==ANNOTATION_VISIBILITY||LA28_0==BOOL_LITERAL||LA28_0==DOUBLE_LITERAL_OR_ID||LA28_0==FLOAT_LITERAL_OR_ID||(LA28_0 >= INSTRUCTION_FORMAT10t && LA28_0 <= INSTRUCTION_FORMAT10x_ODEX)||LA28_0==INSTRUCTION_FORMAT11x||LA28_0==INSTRUCTION_FORMAT12x_OR_ID||(LA28_0 >= INSTRUCTION_FORMAT21c_FIELD && LA28_0 <= INSTRUCTION_FORMAT21c_TYPE)||LA28_0==INSTRUCTION_FORMAT21t||(LA28_0 >= INSTRUCTION_FORMAT22c_FIELD && LA28_0 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA28_0 >= INSTRUCTION_FORMAT22s_OR_ID && LA28_0 <= INSTRUCTION_FORMAT22t)||LA28_0==INSTRUCTION_FORMAT23x||(LA28_0 >= INSTRUCTION_FORMAT31i_OR_ID && LA28_0 <= INSTRUCTION_FORMAT31t)||(LA28_0 >= INSTRUCTION_FORMAT35c_METHOD && LA28_0 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA28_0 >= INSTRUCTION_FORMAT45cc_METHOD && LA28_0 <= INSTRUCTION_FORMAT51l)||(LA28_0 >= NEGATIVE_INTEGER_LITERAL && LA28_0 <= NULL_LITERAL)||(LA28_0 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA28_0 <= PRIMITIVE_TYPE)||LA28_0==REGISTER||LA28_0==SIMPLE_NAME||(LA28_0 >= VERIFICATION_ERROR_TYPE && LA28_0 <= VOID_TYPE)) ) {
+					alt28=1;
+				}
+
+				switch (alt28) {
+				case 1 :
+					// smaliParser.g:684:46: annotation_element
+					{
+					pushFollow(FOLLOW_annotation_element_in_subannotation2822);
+					annotation_element161=annotation_element();
+					state._fsp--;
+
+					stream_annotation_element.add(annotation_element161.getTree());
+					}
+					break;
+
+				default :
+					break loop28;
+				}
+			}
+
+			END_SUBANNOTATION_DIRECTIVE162=(Token)match(input,END_SUBANNOTATION_DIRECTIVE,FOLLOW_END_SUBANNOTATION_DIRECTIVE_in_subannotation2825);  
+			stream_END_SUBANNOTATION_DIRECTIVE.add(END_SUBANNOTATION_DIRECTIVE162);
+
+			// AST REWRITE
+			// elements: CLASS_DESCRIPTOR, annotation_element
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 685:5: -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* )
+			{
+				// smaliParser.g:685:8: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SUBANNOTATION, (retval.start), "I_SUBANNOTATION"), root_1);
+				adaptor.addChild(root_1, stream_CLASS_DESCRIPTOR.nextNode());
+				// smaliParser.g:685:70: ( annotation_element )*
+				while ( stream_annotation_element.hasNext() ) {
+					adaptor.addChild(root_1, stream_annotation_element.nextTree());
+				}
+				stream_annotation_element.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "subannotation"
+
+
+	public static class enum_literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "enum_literal"
+	// smaliParser.g:688:1: enum_literal : ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) ;
+	public final smaliParser.enum_literal_return enum_literal() throws RecognitionException {
+		smaliParser.enum_literal_return retval = new smaliParser.enum_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token ENUM_DIRECTIVE163=null;
+		ParserRuleReturnScope field_reference164 =null;
+
+		CommonTree ENUM_DIRECTIVE163_tree=null;
+		RewriteRuleTokenStream stream_ENUM_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token ENUM_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
+
+		try {
+			// smaliParser.g:689:3: ( ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) )
+			// smaliParser.g:689:5: ENUM_DIRECTIVE field_reference
+			{
+			ENUM_DIRECTIVE163=(Token)match(input,ENUM_DIRECTIVE,FOLLOW_ENUM_DIRECTIVE_in_enum_literal2852);  
+			stream_ENUM_DIRECTIVE.add(ENUM_DIRECTIVE163);
+
+			pushFollow(FOLLOW_field_reference_in_enum_literal2854);
+			field_reference164=field_reference();
+			state._fsp--;
+
+			stream_field_reference.add(field_reference164.getTree());
+			// AST REWRITE
+			// elements: field_reference
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 690:3: -> ^( I_ENCODED_ENUM field_reference )
+			{
+				// smaliParser.g:690:6: ^( I_ENCODED_ENUM field_reference )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_ENUM, "I_ENCODED_ENUM"), root_1);
+				adaptor.addChild(root_1, stream_field_reference.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "enum_literal"
+
+
+	public static class type_field_method_literal_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "type_field_method_literal"
+	// smaliParser.g:692:1: type_field_method_literal : ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE );
+	public final smaliParser.type_field_method_literal_return type_field_method_literal() throws RecognitionException {
+		smaliParser.type_field_method_literal_return retval = new smaliParser.type_field_method_literal_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token ARROW167=null;
+		Token COLON169=null;
+		Token PRIMITIVE_TYPE173=null;
+		Token VOID_TYPE174=null;
+		ParserRuleReturnScope reference_type_descriptor165 =null;
+		ParserRuleReturnScope reference_type_descriptor166 =null;
+		ParserRuleReturnScope member_name168 =null;
+		ParserRuleReturnScope nonvoid_type_descriptor170 =null;
+		ParserRuleReturnScope member_name171 =null;
+		ParserRuleReturnScope method_prototype172 =null;
+
+		CommonTree ARROW167_tree=null;
+		CommonTree COLON169_tree=null;
+		CommonTree PRIMITIVE_TYPE173_tree=null;
+		CommonTree VOID_TYPE174_tree=null;
+		RewriteRuleTokenStream stream_ARROW=new RewriteRuleTokenStream(adaptor,"token ARROW");
+		RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
+		RewriteRuleSubtreeStream stream_method_prototype=new RewriteRuleSubtreeStream(adaptor,"rule method_prototype");
+		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
+		RewriteRuleSubtreeStream stream_member_name=new RewriteRuleSubtreeStream(adaptor,"rule member_name");
+		RewriteRuleSubtreeStream stream_reference_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule reference_type_descriptor");
+
+		try {
+			// smaliParser.g:693:3: ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE )
+			int alt31=4;
+			switch ( input.LA(1) ) {
+			case CLASS_DESCRIPTOR:
+				{
+				int LA31_1 = input.LA(2);
+				if ( (LA31_1==EOF||(LA31_1 >= ACCESS_SPEC && LA31_1 <= ANNOTATION_VISIBILITY)||LA31_1==BOOL_LITERAL||(LA31_1 >= CLASS_DIRECTIVE && LA31_1 <= CLOSE_BRACE)||LA31_1==COMMA||(LA31_1 >= DOUBLE_LITERAL_OR_ID && LA31_1 <= END_ANNOTATION_DIRECTIVE)||LA31_1==END_FIELD_DIRECTIVE||LA31_1==END_SUBANNOTATION_DIRECTIVE||LA31_1==FIELD_DIRECTIVE||(LA31_1 >= FLOAT_LITERAL_OR_ID && LA31_1 <= IMPLEMENTS_DIRECTIVE)||(LA31_1 >= INSTRUCTION_FORMAT10t && LA31_1 <= INSTRUCTION_FORMAT10x_ODEX)||LA31_1==INSTRUCTION_FORMAT11x||LA31_1==INSTRUCTION_FORMAT12x_OR_ID||(LA31_1 >= INSTRUCTION_FORMAT21c_FIELD && LA31_1 <= INSTRUCTION_FORMAT21c_TYPE)||LA31_1==INSTRUCTION_FORMAT21t||(LA31_1 >= INSTRUCTION_FORMAT22c_FIELD && LA31_1 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA31_1 >= INSTRUCTION_FORMAT22s_OR_ID && LA31_1 <= INSTRUCTION_FORMAT22t)||LA31_1==INSTRUCTION_FORMAT23x||(LA31_1 >= INSTRUCTION_FORMAT31i_OR_ID && LA31_1 <= INSTRUCTION_FORMAT31t)||(LA31_1 >= INSTRUCTION_FORMAT35c_METHOD && LA31_1 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA31_1 >= INSTRUCTION_FORMAT45cc_METHOD && LA31_1 <= INSTRUCTION_FORMAT51l)||(LA31_1 >= METHOD_DIRECTIVE && LA31_1 <= NULL_LITERAL)||(LA31_1 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA31_1 <= PRIMITIVE_TYPE)||LA31_1==REGISTER||(LA31_1 >= SIMPLE_NAME && LA31_1 <= SOURCE_DIRECTIVE)||(LA31_1 >= SUPER_DIRECTIVE && LA31_1 <= VOID_TYPE)) ) {
+					alt31=1;
+				}
+				else if ( (LA31_1==ARROW) ) {
+					alt31=2;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 31, 1, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case ARRAY_TYPE_PREFIX:
+				{
+				int LA31_2 = input.LA(2);
+				if ( (LA31_2==CLASS_DESCRIPTOR||LA31_2==PRIMITIVE_TYPE) ) {
+					int LA31_7 = input.LA(3);
+					if ( (LA31_7==EOF||(LA31_7 >= ACCESS_SPEC && LA31_7 <= ANNOTATION_VISIBILITY)||LA31_7==BOOL_LITERAL||(LA31_7 >= CLASS_DIRECTIVE && LA31_7 <= CLOSE_BRACE)||LA31_7==COMMA||(LA31_7 >= DOUBLE_LITERAL_OR_ID && LA31_7 <= END_ANNOTATION_DIRECTIVE)||LA31_7==END_FIELD_DIRECTIVE||LA31_7==END_SUBANNOTATION_DIRECTIVE||LA31_7==FIELD_DIRECTIVE||(LA31_7 >= FLOAT_LITERAL_OR_ID && LA31_7 <= IMPLEMENTS_DIRECTIVE)||(LA31_7 >= INSTRUCTION_FORMAT10t && LA31_7 <= INSTRUCTION_FORMAT10x_ODEX)||LA31_7==INSTRUCTION_FORMAT11x||LA31_7==INSTRUCTION_FORMAT12x_OR_ID||(LA31_7 >= INSTRUCTION_FORMAT21c_FIELD && LA31_7 <= INSTRUCTION_FORMAT21c_TYPE)||LA31_7==INSTRUCTION_FORMAT21t||(LA31_7 >= INSTRUCTION_FORMAT22c_FIELD && LA31_7 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA31_7 >= INSTRUCTION_FORMAT22s_OR_ID && LA31_7 <= INSTRUCTION_FORMAT22t)||LA31_7==INSTRUCTION_FORMAT23x||(LA31_7 >= INSTRUCTION_FORMAT31i_OR_ID && LA31_7 <= INSTRUCTION_FORMAT31t)||(LA31_7 >= INSTRUCTION_FORMAT35c_METHOD && LA31_7 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA31_7 >= INSTRUCTION_FORMAT45cc_METHOD && LA31_7 <= INSTRUCTION_FORMAT51l)||(LA31_7 >= METHOD_DIRECTIVE && LA31_7 <= NULL_LITERAL)||(LA31_7 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA31_7 <= PRIMITIVE_TYPE)||LA31_7==REGISTER||(LA31_7 >= SIMPLE_NAME && LA31_7 <= SOURCE_DIRECTIVE)||(LA31_7 >= SUPER_DIRECTIVE && LA31_7 <= VOID_TYPE)) ) {
+						alt31=1;
+					}
+					else if ( (LA31_7==ARROW) ) {
+						alt31=2;
+					}
+
+					else {
+						int nvaeMark = input.mark();
+						try {
+							for (int nvaeConsume = 0; nvaeConsume < 3 - 1; nvaeConsume++) {
+								input.consume();
+							}
+							NoViableAltException nvae =
+								new NoViableAltException("", 31, 7, input);
+							throw nvae;
+						} finally {
+							input.rewind(nvaeMark);
+						}
+					}
+
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 31, 2, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case ACCESS_SPEC:
+			case ANNOTATION_VISIBILITY:
+			case BOOL_LITERAL:
+			case DOUBLE_LITERAL_OR_ID:
+			case FLOAT_LITERAL_OR_ID:
+			case INSTRUCTION_FORMAT10t:
+			case INSTRUCTION_FORMAT10x:
+			case INSTRUCTION_FORMAT10x_ODEX:
+			case INSTRUCTION_FORMAT11x:
+			case INSTRUCTION_FORMAT12x_OR_ID:
+			case INSTRUCTION_FORMAT21c_FIELD:
+			case INSTRUCTION_FORMAT21c_FIELD_ODEX:
+			case INSTRUCTION_FORMAT21c_STRING:
+			case INSTRUCTION_FORMAT21c_TYPE:
+			case INSTRUCTION_FORMAT21t:
+			case INSTRUCTION_FORMAT22c_FIELD:
+			case INSTRUCTION_FORMAT22c_FIELD_ODEX:
+			case INSTRUCTION_FORMAT22c_TYPE:
+			case INSTRUCTION_FORMAT22cs_FIELD:
+			case INSTRUCTION_FORMAT22s_OR_ID:
+			case INSTRUCTION_FORMAT22t:
+			case INSTRUCTION_FORMAT23x:
+			case INSTRUCTION_FORMAT31i_OR_ID:
+			case INSTRUCTION_FORMAT31t:
+			case INSTRUCTION_FORMAT35c_METHOD:
+			case INSTRUCTION_FORMAT35c_METHOD_ODEX:
+			case INSTRUCTION_FORMAT35c_TYPE:
+			case INSTRUCTION_FORMAT35mi_METHOD:
+			case INSTRUCTION_FORMAT35ms_METHOD:
+			case INSTRUCTION_FORMAT45cc_METHOD:
+			case INSTRUCTION_FORMAT4rcc_METHOD:
+			case INSTRUCTION_FORMAT51l:
+			case MEMBER_NAME:
+			case NEGATIVE_INTEGER_LITERAL:
+			case NULL_LITERAL:
+			case PARAM_LIST_OR_ID_PRIMITIVE_TYPE:
+			case POSITIVE_INTEGER_LITERAL:
+			case REGISTER:
+			case SIMPLE_NAME:
+			case VERIFICATION_ERROR_TYPE:
+				{
+				alt31=2;
+				}
+				break;
+			case PRIMITIVE_TYPE:
+				{
+				int LA31_4 = input.LA(2);
+				if ( (LA31_4==COLON||LA31_4==OPEN_PAREN) ) {
+					alt31=2;
+				}
+				else if ( (LA31_4==EOF||(LA31_4 >= ACCESS_SPEC && LA31_4 <= ANNOTATION_VISIBILITY)||LA31_4==BOOL_LITERAL||(LA31_4 >= CLASS_DIRECTIVE && LA31_4 <= CLOSE_BRACE)||LA31_4==COMMA||(LA31_4 >= DOUBLE_LITERAL_OR_ID && LA31_4 <= END_ANNOTATION_DIRECTIVE)||LA31_4==END_FIELD_DIRECTIVE||LA31_4==END_SUBANNOTATION_DIRECTIVE||LA31_4==FIELD_DIRECTIVE||(LA31_4 >= FLOAT_LITERAL_OR_ID && LA31_4 <= IMPLEMENTS_DIRECTIVE)||(LA31_4 >= INSTRUCTION_FORMAT10t && LA31_4 <= INSTRUCTION_FORMAT10x_ODEX)||LA31_4==INSTRUCTION_FORMAT11x||LA31_4==INSTRUCTION_FORMAT12x_OR_ID||(LA31_4 >= INSTRUCTION_FORMAT21c_FIELD && LA31_4 <= INSTRUCTION_FORMAT21c_TYPE)||LA31_4==INSTRUCTION_FORMAT21t||(LA31_4 >= INSTRUCTION_FORMAT22c_FIELD && LA31_4 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA31_4 >= INSTRUCTION_FORMAT22s_OR_ID && LA31_4 <= INSTRUCTION_FORMAT22t)||LA31_4==INSTRUCTION_FORMAT23x||(LA31_4 >= INSTRUCTION_FORMAT31i_OR_ID && LA31_4 <= INSTRUCTION_FORMAT31t)||(LA31_4 >= INSTRUCTION_FORMAT35c_METHOD && LA31_4 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA31_4 >= INSTRUCTION_FORMAT45cc_METHOD && LA31_4 <= INSTRUCTION_FORMAT51l)||(LA31_4 >= METHOD_DIRECTIVE && LA31_4 <= NULL_LITERAL)||(LA31_4 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA31_4 <= PRIMITIVE_TYPE)||LA31_4==REGISTER||(LA31_4 >= SIMPLE_NAME && LA31_4 <= SOURCE_DIRECTIVE)||(LA31_4 >= SUPER_DIRECTIVE && LA31_4 <= VOID_TYPE)) ) {
+					alt31=3;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 31, 4, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case VOID_TYPE:
+				{
+				int LA31_5 = input.LA(2);
+				if ( (LA31_5==COLON||LA31_5==OPEN_PAREN) ) {
+					alt31=2;
+				}
+				else if ( (LA31_5==EOF||(LA31_5 >= ACCESS_SPEC && LA31_5 <= ANNOTATION_VISIBILITY)||LA31_5==BOOL_LITERAL||(LA31_5 >= CLASS_DIRECTIVE && LA31_5 <= CLOSE_BRACE)||LA31_5==COMMA||(LA31_5 >= DOUBLE_LITERAL_OR_ID && LA31_5 <= END_ANNOTATION_DIRECTIVE)||LA31_5==END_FIELD_DIRECTIVE||LA31_5==END_SUBANNOTATION_DIRECTIVE||LA31_5==FIELD_DIRECTIVE||(LA31_5 >= FLOAT_LITERAL_OR_ID && LA31_5 <= IMPLEMENTS_DIRECTIVE)||(LA31_5 >= INSTRUCTION_FORMAT10t && LA31_5 <= INSTRUCTION_FORMAT10x_ODEX)||LA31_5==INSTRUCTION_FORMAT11x||LA31_5==INSTRUCTION_FORMAT12x_OR_ID||(LA31_5 >= INSTRUCTION_FORMAT21c_FIELD && LA31_5 <= INSTRUCTION_FORMAT21c_TYPE)||LA31_5==INSTRUCTION_FORMAT21t||(LA31_5 >= INSTRUCTION_FORMAT22c_FIELD && LA31_5 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA31_5 >= INSTRUCTION_FORMAT22s_OR_ID && LA31_5 <= INSTRUCTION_FORMAT22t)||LA31_5==INSTRUCTION_FORMAT23x||(LA31_5 >= INSTRUCTION_FORMAT31i_OR_ID && LA31_5 <= INSTRUCTION_FORMAT31t)||(LA31_5 >= INSTRUCTION_FORMAT35c_METHOD && LA31_5 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA31_5 >= INSTRUCTION_FORMAT45cc_METHOD && LA31_5 <= INSTRUCTION_FORMAT51l)||(LA31_5 >= METHOD_DIRECTIVE && LA31_5 <= NULL_LITERAL)||(LA31_5 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA31_5 <= PRIMITIVE_TYPE)||LA31_5==REGISTER||(LA31_5 >= SIMPLE_NAME && LA31_5 <= SOURCE_DIRECTIVE)||(LA31_5 >= SUPER_DIRECTIVE && LA31_5 <= VOID_TYPE)) ) {
+					alt31=4;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 31, 5, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 31, 0, input);
+				throw nvae;
+			}
+			switch (alt31) {
+				case 1 :
+					// smaliParser.g:693:5: reference_type_descriptor
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_reference_type_descriptor_in_type_field_method_literal2874);
+					reference_type_descriptor165=reference_type_descriptor();
+					state._fsp--;
+
+					adaptor.addChild(root_0, reference_type_descriptor165.getTree());
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) )
+					{
+					// smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) )
+					// smaliParser.g:694:7: ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) )
+					{
+					// smaliParser.g:694:7: ( reference_type_descriptor ARROW )?
+					int alt29=2;
+					int LA29_0 = input.LA(1);
+					if ( (LA29_0==ARRAY_TYPE_PREFIX||LA29_0==CLASS_DESCRIPTOR) ) {
+						alt29=1;
+					}
+					switch (alt29) {
+						case 1 :
+							// smaliParser.g:694:8: reference_type_descriptor ARROW
+							{
+							pushFollow(FOLLOW_reference_type_descriptor_in_type_field_method_literal2883);
+							reference_type_descriptor166=reference_type_descriptor();
+							state._fsp--;
+
+							stream_reference_type_descriptor.add(reference_type_descriptor166.getTree());
+							ARROW167=(Token)match(input,ARROW,FOLLOW_ARROW_in_type_field_method_literal2885);  
+							stream_ARROW.add(ARROW167);
+
+							}
+							break;
+
+					}
+
+					// smaliParser.g:695:7: ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) )
+					int alt30=2;
+					alt30 = dfa30.predict(input);
+					switch (alt30) {
+						case 1 :
+							// smaliParser.g:695:9: member_name COLON nonvoid_type_descriptor
+							{
+							pushFollow(FOLLOW_member_name_in_type_field_method_literal2897);
+							member_name168=member_name();
+							state._fsp--;
+
+							stream_member_name.add(member_name168.getTree());
+							COLON169=(Token)match(input,COLON,FOLLOW_COLON_in_type_field_method_literal2899);  
+							stream_COLON.add(COLON169);
+
+							pushFollow(FOLLOW_nonvoid_type_descriptor_in_type_field_method_literal2901);
+							nonvoid_type_descriptor170=nonvoid_type_descriptor();
+							state._fsp--;
+
+							stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor170.getTree());
+							// AST REWRITE
+							// elements: reference_type_descriptor, member_name, nonvoid_type_descriptor
+							// token labels: 
+							// rule labels: retval
+							// token list labels: 
+							// rule list labels: 
+							// wildcard labels: 
+							retval.tree = root_0;
+							RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+							root_0 = (CommonTree)adaptor.nil();
+							// 695:51: -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor )
+							{
+								// smaliParser.g:695:54: ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor )
+								{
+								CommonTree root_1 = (CommonTree)adaptor.nil();
+								root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_FIELD, "I_ENCODED_FIELD"), root_1);
+								// smaliParser.g:695:72: ( reference_type_descriptor )?
+								if ( stream_reference_type_descriptor.hasNext() ) {
+									adaptor.addChild(root_1, stream_reference_type_descriptor.nextTree());
+								}
+								stream_reference_type_descriptor.reset();
+
+								adaptor.addChild(root_1, stream_member_name.nextTree());
+								adaptor.addChild(root_1, stream_nonvoid_type_descriptor.nextTree());
+								adaptor.addChild(root_0, root_1);
+								}
+
+							}
+
+
+							retval.tree = root_0;
+
+							}
+							break;
+						case 2 :
+							// smaliParser.g:696:9: member_name method_prototype
+							{
+							pushFollow(FOLLOW_member_name_in_type_field_method_literal2924);
+							member_name171=member_name();
+							state._fsp--;
+
+							stream_member_name.add(member_name171.getTree());
+							pushFollow(FOLLOW_method_prototype_in_type_field_method_literal2926);
+							method_prototype172=method_prototype();
+							state._fsp--;
+
+							stream_method_prototype.add(method_prototype172.getTree());
+							// AST REWRITE
+							// elements: member_name, method_prototype, reference_type_descriptor
+							// token labels: 
+							// rule labels: retval
+							// token list labels: 
+							// rule list labels: 
+							// wildcard labels: 
+							retval.tree = root_0;
+							RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+							root_0 = (CommonTree)adaptor.nil();
+							// 696:38: -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype )
+							{
+								// smaliParser.g:696:41: ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype )
+								{
+								CommonTree root_1 = (CommonTree)adaptor.nil();
+								root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_METHOD, "I_ENCODED_METHOD"), root_1);
+								// smaliParser.g:696:60: ( reference_type_descriptor )?
+								if ( stream_reference_type_descriptor.hasNext() ) {
+									adaptor.addChild(root_1, stream_reference_type_descriptor.nextTree());
+								}
+								stream_reference_type_descriptor.reset();
+
+								adaptor.addChild(root_1, stream_member_name.nextTree());
+								adaptor.addChild(root_1, stream_method_prototype.nextTree());
+								adaptor.addChild(root_0, root_1);
+								}
+
+							}
+
+
+							retval.tree = root_0;
+
+							}
+							break;
+
+					}
+
+					}
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:699:5: PRIMITIVE_TYPE
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					PRIMITIVE_TYPE173=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_field_method_literal2959); 
+					PRIMITIVE_TYPE173_tree = (CommonTree)adaptor.create(PRIMITIVE_TYPE173);
+					adaptor.addChild(root_0, PRIMITIVE_TYPE173_tree);
+
+					}
+					break;
+				case 4 :
+					// smaliParser.g:700:5: VOID_TYPE
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					VOID_TYPE174=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_field_method_literal2965); 
+					VOID_TYPE174_tree = (CommonTree)adaptor.create(VOID_TYPE174);
+					adaptor.addChild(root_0, VOID_TYPE174_tree);
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "type_field_method_literal"
+
+
+	public static class method_reference_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "method_reference"
+	// smaliParser.g:702:1: method_reference : ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype ;
+	public final smaliParser.method_reference_return method_reference() throws RecognitionException {
+		smaliParser.method_reference_return retval = new smaliParser.method_reference_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token ARROW176=null;
+		ParserRuleReturnScope reference_type_descriptor175 =null;
+		ParserRuleReturnScope member_name177 =null;
+		ParserRuleReturnScope method_prototype178 =null;
+
+		CommonTree ARROW176_tree=null;
+		RewriteRuleTokenStream stream_ARROW=new RewriteRuleTokenStream(adaptor,"token ARROW");
+		RewriteRuleSubtreeStream stream_method_prototype=new RewriteRuleSubtreeStream(adaptor,"rule method_prototype");
+		RewriteRuleSubtreeStream stream_member_name=new RewriteRuleSubtreeStream(adaptor,"rule member_name");
+		RewriteRuleSubtreeStream stream_reference_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule reference_type_descriptor");
+
+		try {
+			// smaliParser.g:703:3: ( ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype )
+			// smaliParser.g:703:5: ( reference_type_descriptor ARROW )? member_name method_prototype
+			{
+			// smaliParser.g:703:5: ( reference_type_descriptor ARROW )?
+			int alt32=2;
+			int LA32_0 = input.LA(1);
+			if ( (LA32_0==ARRAY_TYPE_PREFIX||LA32_0==CLASS_DESCRIPTOR) ) {
+				alt32=1;
+			}
+			switch (alt32) {
+				case 1 :
+					// smaliParser.g:703:6: reference_type_descriptor ARROW
+					{
+					pushFollow(FOLLOW_reference_type_descriptor_in_method_reference2976);
+					reference_type_descriptor175=reference_type_descriptor();
+					state._fsp--;
+
+					stream_reference_type_descriptor.add(reference_type_descriptor175.getTree());
+					ARROW176=(Token)match(input,ARROW,FOLLOW_ARROW_in_method_reference2978);  
+					stream_ARROW.add(ARROW176);
+
+					}
+					break;
+
+			}
+
+			pushFollow(FOLLOW_member_name_in_method_reference2982);
+			member_name177=member_name();
+			state._fsp--;
+
+			stream_member_name.add(member_name177.getTree());
+			pushFollow(FOLLOW_method_prototype_in_method_reference2984);
+			method_prototype178=method_prototype();
+			state._fsp--;
+
+			stream_method_prototype.add(method_prototype178.getTree());
+			// AST REWRITE
+			// elements: method_prototype, reference_type_descriptor, member_name
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 704:3: -> ( reference_type_descriptor )? member_name method_prototype
+			{
+				// smaliParser.g:704:6: ( reference_type_descriptor )?
+				if ( stream_reference_type_descriptor.hasNext() ) {
+					adaptor.addChild(root_0, stream_reference_type_descriptor.nextTree());
+				}
+				stream_reference_type_descriptor.reset();
+
+				adaptor.addChild(root_0, stream_member_name.nextTree());
+				adaptor.addChild(root_0, stream_method_prototype.nextTree());
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "method_reference"
+
+
+	public static class field_reference_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "field_reference"
+	// smaliParser.g:706:1: field_reference : ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor ;
+	public final smaliParser.field_reference_return field_reference() throws RecognitionException {
+		smaliParser.field_reference_return retval = new smaliParser.field_reference_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token ARROW180=null;
+		Token COLON182=null;
+		ParserRuleReturnScope reference_type_descriptor179 =null;
+		ParserRuleReturnScope member_name181 =null;
+		ParserRuleReturnScope nonvoid_type_descriptor183 =null;
+
+		CommonTree ARROW180_tree=null;
+		CommonTree COLON182_tree=null;
+		RewriteRuleTokenStream stream_ARROW=new RewriteRuleTokenStream(adaptor,"token ARROW");
+		RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
+		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
+		RewriteRuleSubtreeStream stream_member_name=new RewriteRuleSubtreeStream(adaptor,"rule member_name");
+		RewriteRuleSubtreeStream stream_reference_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule reference_type_descriptor");
+
+		try {
+			// smaliParser.g:707:3: ( ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor )
+			// smaliParser.g:707:5: ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor
+			{
+			// smaliParser.g:707:5: ( reference_type_descriptor ARROW )?
+			int alt33=2;
+			int LA33_0 = input.LA(1);
+			if ( (LA33_0==ARRAY_TYPE_PREFIX||LA33_0==CLASS_DESCRIPTOR) ) {
+				alt33=1;
+			}
+			switch (alt33) {
+				case 1 :
+					// smaliParser.g:707:6: reference_type_descriptor ARROW
+					{
+					pushFollow(FOLLOW_reference_type_descriptor_in_field_reference3006);
+					reference_type_descriptor179=reference_type_descriptor();
+					state._fsp--;
+
+					stream_reference_type_descriptor.add(reference_type_descriptor179.getTree());
+					ARROW180=(Token)match(input,ARROW,FOLLOW_ARROW_in_field_reference3008);  
+					stream_ARROW.add(ARROW180);
+
+					}
+					break;
+
+			}
+
+			pushFollow(FOLLOW_member_name_in_field_reference3012);
+			member_name181=member_name();
+			state._fsp--;
+
+			stream_member_name.add(member_name181.getTree());
+			COLON182=(Token)match(input,COLON,FOLLOW_COLON_in_field_reference3014);  
+			stream_COLON.add(COLON182);
+
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_field_reference3016);
+			nonvoid_type_descriptor183=nonvoid_type_descriptor();
+			state._fsp--;
+
+			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor183.getTree());
+			// AST REWRITE
+			// elements: reference_type_descriptor, nonvoid_type_descriptor, member_name
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 708:3: -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor
+			{
+				// smaliParser.g:708:6: ( reference_type_descriptor )?
+				if ( stream_reference_type_descriptor.hasNext() ) {
+					adaptor.addChild(root_0, stream_reference_type_descriptor.nextTree());
+				}
+				stream_reference_type_descriptor.reset();
+
+				adaptor.addChild(root_0, stream_member_name.nextTree());
+				adaptor.addChild(root_0, stream_nonvoid_type_descriptor.nextTree());
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "field_reference"
+
+
+	public static class label_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "label"
+	// smaliParser.g:710:1: label : COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) ;
+	public final smaliParser.label_return label() throws RecognitionException {
+		smaliParser.label_return retval = new smaliParser.label_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token COLON184=null;
+		ParserRuleReturnScope simple_name185 =null;
+
+		CommonTree COLON184_tree=null;
+		RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
+		RewriteRuleSubtreeStream stream_simple_name=new RewriteRuleSubtreeStream(adaptor,"rule simple_name");
+
+		try {
+			// smaliParser.g:711:3: ( COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) )
+			// smaliParser.g:711:5: COLON simple_name
+			{
+			COLON184=(Token)match(input,COLON,FOLLOW_COLON_in_label3037);  
+			stream_COLON.add(COLON184);
+
+			pushFollow(FOLLOW_simple_name_in_label3039);
+			simple_name185=simple_name();
+			state._fsp--;
+
+			stream_simple_name.add(simple_name185.getTree());
+			// AST REWRITE
+			// elements: simple_name
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 711:23: -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name )
+			{
+				// smaliParser.g:711:26: ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LABEL, COLON184, "I_LABEL"), root_1);
+				adaptor.addChild(root_1, stream_simple_name.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "label"
+
+
+	public static class label_ref_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "label_ref"
+	// smaliParser.g:713:1: label_ref : COLON simple_name -> simple_name ;
+	public final smaliParser.label_ref_return label_ref() throws RecognitionException {
+		smaliParser.label_ref_return retval = new smaliParser.label_ref_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token COLON186=null;
+		ParserRuleReturnScope simple_name187 =null;
+
+		CommonTree COLON186_tree=null;
+		RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
+		RewriteRuleSubtreeStream stream_simple_name=new RewriteRuleSubtreeStream(adaptor,"rule simple_name");
+
+		try {
+			// smaliParser.g:714:3: ( COLON simple_name -> simple_name )
+			// smaliParser.g:714:5: COLON simple_name
+			{
+			COLON186=(Token)match(input,COLON,FOLLOW_COLON_in_label_ref3058);  
+			stream_COLON.add(COLON186);
+
+			pushFollow(FOLLOW_simple_name_in_label_ref3060);
+			simple_name187=simple_name();
+			state._fsp--;
+
+			stream_simple_name.add(simple_name187.getTree());
+			// AST REWRITE
+			// elements: simple_name
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 714:23: -> simple_name
+			{
+				adaptor.addChild(root_0, stream_simple_name.nextTree());
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "label_ref"
+
+
+	public static class register_list_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "register_list"
+	// smaliParser.g:716:1: register_list : ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) );
+	public final smaliParser.register_list_return register_list() throws RecognitionException {
+		smaliParser.register_list_return retval = new smaliParser.register_list_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token REGISTER188=null;
+		Token COMMA189=null;
+		Token REGISTER190=null;
+
+		CommonTree REGISTER188_tree=null;
+		CommonTree COMMA189_tree=null;
+		CommonTree REGISTER190_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+
+		try {
+			// smaliParser.g:717:3: ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) )
+			int alt35=2;
+			int LA35_0 = input.LA(1);
+			if ( (LA35_0==REGISTER) ) {
+				alt35=1;
+			}
+			else if ( (LA35_0==CLOSE_BRACE) ) {
+				alt35=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 35, 0, input);
+				throw nvae;
+			}
+
+			switch (alt35) {
+				case 1 :
+					// smaliParser.g:717:5: REGISTER ( COMMA REGISTER )*
+					{
+					REGISTER188=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3074);  
+					stream_REGISTER.add(REGISTER188);
+
+					// smaliParser.g:717:14: ( COMMA REGISTER )*
+					loop34:
+					while (true) {
+						int alt34=2;
+						int LA34_0 = input.LA(1);
+						if ( (LA34_0==COMMA) ) {
+							alt34=1;
+						}
+
+						switch (alt34) {
+						case 1 :
+							// smaliParser.g:717:15: COMMA REGISTER
+							{
+							COMMA189=(Token)match(input,COMMA,FOLLOW_COMMA_in_register_list3077);  
+							stream_COMMA.add(COMMA189);
+
+							REGISTER190=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3079);  
+							stream_REGISTER.add(REGISTER190);
+
+							}
+							break;
+
+						default :
+							break loop34;
+						}
+					}
+
+					// AST REWRITE
+					// elements: REGISTER
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 717:32: -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* )
+					{
+						// smaliParser.g:717:35: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* )
+						{
+						CommonTree root_1 = (CommonTree)adaptor.nil();
+						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTER_LIST, (retval.start), "I_REGISTER_LIST"), root_1);
+						// smaliParser.g:717:80: ( REGISTER )*
+						while ( stream_REGISTER.hasNext() ) {
+							adaptor.addChild(root_1, stream_REGISTER.nextNode());
+						}
+						stream_REGISTER.reset();
+
+						adaptor.addChild(root_0, root_1);
+						}
+
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:718:5: 
+					{
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 718:5: -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] )
+					{
+						// smaliParser.g:718:7: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] )
+						{
+						CommonTree root_1 = (CommonTree)adaptor.nil();
+						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTER_LIST, (retval.start), "I_REGISTER_LIST"), root_1);
+						adaptor.addChild(root_0, root_1);
+						}
+
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "register_list"
+
+
+	public static class register_range_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "register_range"
+	// smaliParser.g:720:1: register_range : (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) ;
+	public final smaliParser.register_range_return register_range() throws RecognitionException {
+		smaliParser.register_range_return retval = new smaliParser.register_range_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token startreg=null;
+		Token endreg=null;
+		Token DOTDOT191=null;
+
+		CommonTree startreg_tree=null;
+		CommonTree endreg_tree=null;
+		CommonTree DOTDOT191_tree=null;
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_DOTDOT=new RewriteRuleTokenStream(adaptor,"token DOTDOT");
+
+		try {
+			// smaliParser.g:721:3: ( (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) )
+			// smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )?
+			{
+			// smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )?
+			int alt37=2;
+			int LA37_0 = input.LA(1);
+			if ( (LA37_0==REGISTER) ) {
+				alt37=1;
+			}
+			switch (alt37) {
+				case 1 :
+					// smaliParser.g:721:6: startreg= REGISTER ( DOTDOT endreg= REGISTER )?
+					{
+					startreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3114);  
+					stream_REGISTER.add(startreg);
+
+					// smaliParser.g:721:24: ( DOTDOT endreg= REGISTER )?
+					int alt36=2;
+					int LA36_0 = input.LA(1);
+					if ( (LA36_0==DOTDOT) ) {
+						alt36=1;
+					}
+					switch (alt36) {
+						case 1 :
+							// smaliParser.g:721:25: DOTDOT endreg= REGISTER
+							{
+							DOTDOT191=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_register_range3117);  
+							stream_DOTDOT.add(DOTDOT191);
+
+							endreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3121);  
+							stream_REGISTER.add(endreg);
+
+							}
+							break;
+
+					}
+
+					}
+					break;
+
+			}
+
+			// AST REWRITE
+			// elements: startreg, endreg
+			// token labels: startreg, endreg
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleTokenStream stream_startreg=new RewriteRuleTokenStream(adaptor,"token startreg",startreg);
+			RewriteRuleTokenStream stream_endreg=new RewriteRuleTokenStream(adaptor,"token endreg",endreg);
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 721:52: -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? )
+			{
+				// smaliParser.g:721:55: ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTER_RANGE, (retval.start), "I_REGISTER_RANGE"), root_1);
+				// smaliParser.g:721:103: ( $startreg)?
+				if ( stream_startreg.hasNext() ) {
+					adaptor.addChild(root_1, stream_startreg.nextNode());
+				}
+				stream_startreg.reset();
+
+				// smaliParser.g:721:114: ( $endreg)?
+				if ( stream_endreg.hasNext() ) {
+					adaptor.addChild(root_1, stream_endreg.nextNode());
+				}
+				stream_endreg.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "register_range"
+
+
+	public static class verification_error_reference_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "verification_error_reference"
+	// smaliParser.g:723:1: verification_error_reference : ( CLASS_DESCRIPTOR | field_reference | method_reference );
+	public final smaliParser.verification_error_reference_return verification_error_reference() throws RecognitionException {
+		smaliParser.verification_error_reference_return retval = new smaliParser.verification_error_reference_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token CLASS_DESCRIPTOR192=null;
+		ParserRuleReturnScope field_reference193 =null;
+		ParserRuleReturnScope method_reference194 =null;
+
+		CommonTree CLASS_DESCRIPTOR192_tree=null;
+
+		try {
+			// smaliParser.g:724:3: ( CLASS_DESCRIPTOR | field_reference | method_reference )
+			int alt38=3;
+			alt38 = dfa38.predict(input);
+			switch (alt38) {
+				case 1 :
+					// smaliParser.g:724:5: CLASS_DESCRIPTOR
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					CLASS_DESCRIPTOR192=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference3150); 
+					CLASS_DESCRIPTOR192_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR192);
+					adaptor.addChild(root_0, CLASS_DESCRIPTOR192_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:724:24: field_reference
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_field_reference_in_verification_error_reference3154);
+					field_reference193=field_reference();
+					state._fsp--;
+
+					adaptor.addChild(root_0, field_reference193.getTree());
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:724:42: method_reference
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_method_reference_in_verification_error_reference3158);
+					method_reference194=method_reference();
+					state._fsp--;
+
+					adaptor.addChild(root_0, method_reference194.getTree());
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "verification_error_reference"
+
+
+	public static class catch_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "catch_directive"
+	// smaliParser.g:726:1: catch_directive : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) ;
+	public final smaliParser.catch_directive_return catch_directive() throws RecognitionException {
+		smaliParser.catch_directive_return retval = new smaliParser.catch_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token CATCH_DIRECTIVE195=null;
+		Token OPEN_BRACE197=null;
+		Token DOTDOT198=null;
+		Token CLOSE_BRACE199=null;
+		ParserRuleReturnScope from =null;
+		ParserRuleReturnScope to =null;
+		ParserRuleReturnScope using =null;
+		ParserRuleReturnScope nonvoid_type_descriptor196 =null;
+
+		CommonTree CATCH_DIRECTIVE195_tree=null;
+		CommonTree OPEN_BRACE197_tree=null;
+		CommonTree DOTDOT198_tree=null;
+		CommonTree CLOSE_BRACE199_tree=null;
+		RewriteRuleTokenStream stream_OPEN_BRACE=new RewriteRuleTokenStream(adaptor,"token OPEN_BRACE");
+		RewriteRuleTokenStream stream_CLOSE_BRACE=new RewriteRuleTokenStream(adaptor,"token CLOSE_BRACE");
+		RewriteRuleTokenStream stream_DOTDOT=new RewriteRuleTokenStream(adaptor,"token DOTDOT");
+		RewriteRuleTokenStream stream_CATCH_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token CATCH_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
+
+		try {
+			// smaliParser.g:727:3: ( CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) )
+			// smaliParser.g:727:5: CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref
+			{
+			CATCH_DIRECTIVE195=(Token)match(input,CATCH_DIRECTIVE,FOLLOW_CATCH_DIRECTIVE_in_catch_directive3168);  
+			stream_CATCH_DIRECTIVE.add(CATCH_DIRECTIVE195);
+
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_catch_directive3170);
+			nonvoid_type_descriptor196=nonvoid_type_descriptor();
+			state._fsp--;
+
+			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor196.getTree());
+			OPEN_BRACE197=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catch_directive3172);  
+			stream_OPEN_BRACE.add(OPEN_BRACE197);
+
+			pushFollow(FOLLOW_label_ref_in_catch_directive3176);
+			from=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(from.getTree());
+			DOTDOT198=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catch_directive3178);  
+			stream_DOTDOT.add(DOTDOT198);
+
+			pushFollow(FOLLOW_label_ref_in_catch_directive3182);
+			to=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(to.getTree());
+			CLOSE_BRACE199=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catch_directive3184);  
+			stream_CLOSE_BRACE.add(CLOSE_BRACE199);
+
+			pushFollow(FOLLOW_label_ref_in_catch_directive3188);
+			using=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(using.getTree());
+			// AST REWRITE
+			// elements: from, nonvoid_type_descriptor, using, to
+			// token labels: 
+			// rule labels: using, from, to, retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_using=new RewriteRuleSubtreeStream(adaptor,"rule using",using!=null?using.getTree():null);
+			RewriteRuleSubtreeStream stream_from=new RewriteRuleSubtreeStream(adaptor,"rule from",from!=null?from.getTree():null);
+			RewriteRuleSubtreeStream stream_to=new RewriteRuleSubtreeStream(adaptor,"rule to",to!=null?to.getTree():null);
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 728:5: -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using)
+			{
+				// smaliParser.g:728:8: ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using)
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CATCH, (retval.start), "I_CATCH"), root_1);
+				adaptor.addChild(root_1, stream_nonvoid_type_descriptor.nextTree());
+				adaptor.addChild(root_1, stream_from.nextTree());
+				adaptor.addChild(root_1, stream_to.nextTree());
+				adaptor.addChild(root_1, stream_using.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "catch_directive"
+
+
+	public static class catchall_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "catchall_directive"
+	// smaliParser.g:730:1: catchall_directive : CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) ;
+	public final smaliParser.catchall_directive_return catchall_directive() throws RecognitionException {
+		smaliParser.catchall_directive_return retval = new smaliParser.catchall_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token CATCHALL_DIRECTIVE200=null;
+		Token OPEN_BRACE201=null;
+		Token DOTDOT202=null;
+		Token CLOSE_BRACE203=null;
+		ParserRuleReturnScope from =null;
+		ParserRuleReturnScope to =null;
+		ParserRuleReturnScope using =null;
+
+		CommonTree CATCHALL_DIRECTIVE200_tree=null;
+		CommonTree OPEN_BRACE201_tree=null;
+		CommonTree DOTDOT202_tree=null;
+		CommonTree CLOSE_BRACE203_tree=null;
+		RewriteRuleTokenStream stream_OPEN_BRACE=new RewriteRuleTokenStream(adaptor,"token OPEN_BRACE");
+		RewriteRuleTokenStream stream_CLOSE_BRACE=new RewriteRuleTokenStream(adaptor,"token CLOSE_BRACE");
+		RewriteRuleTokenStream stream_DOTDOT=new RewriteRuleTokenStream(adaptor,"token DOTDOT");
+		RewriteRuleTokenStream stream_CATCHALL_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token CATCHALL_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+
+		try {
+			// smaliParser.g:731:3: ( CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) )
+			// smaliParser.g:731:5: CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref
+			{
+			CATCHALL_DIRECTIVE200=(Token)match(input,CATCHALL_DIRECTIVE,FOLLOW_CATCHALL_DIRECTIVE_in_catchall_directive3220);  
+			stream_CATCHALL_DIRECTIVE.add(CATCHALL_DIRECTIVE200);
+
+			OPEN_BRACE201=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catchall_directive3222);  
+			stream_OPEN_BRACE.add(OPEN_BRACE201);
+
+			pushFollow(FOLLOW_label_ref_in_catchall_directive3226);
+			from=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(from.getTree());
+			DOTDOT202=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catchall_directive3228);  
+			stream_DOTDOT.add(DOTDOT202);
+
+			pushFollow(FOLLOW_label_ref_in_catchall_directive3232);
+			to=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(to.getTree());
+			CLOSE_BRACE203=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catchall_directive3234);  
+			stream_CLOSE_BRACE.add(CLOSE_BRACE203);
+
+			pushFollow(FOLLOW_label_ref_in_catchall_directive3238);
+			using=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(using.getTree());
+			// AST REWRITE
+			// elements: using, to, from
+			// token labels: 
+			// rule labels: using, from, to, retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_using=new RewriteRuleSubtreeStream(adaptor,"rule using",using!=null?using.getTree():null);
+			RewriteRuleSubtreeStream stream_from=new RewriteRuleSubtreeStream(adaptor,"rule from",from!=null?from.getTree():null);
+			RewriteRuleSubtreeStream stream_to=new RewriteRuleSubtreeStream(adaptor,"rule to",to!=null?to.getTree():null);
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 732:5: -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using)
+			{
+				// smaliParser.g:732:8: ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using)
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CATCHALL, (retval.start), "I_CATCHALL"), root_1);
+				adaptor.addChild(root_1, stream_from.nextTree());
+				adaptor.addChild(root_1, stream_to.nextTree());
+				adaptor.addChild(root_1, stream_using.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "catchall_directive"
+
+
+	public static class parameter_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "parameter_directive"
+	// smaliParser.g:738:1: parameter_directive : PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) ;
+	public final smaliParser.parameter_directive_return parameter_directive() throws RecognitionException {
+		smaliParser.parameter_directive_return retval = new smaliParser.parameter_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token PARAMETER_DIRECTIVE204=null;
+		Token REGISTER205=null;
+		Token COMMA206=null;
+		Token STRING_LITERAL207=null;
+		Token END_PARAMETER_DIRECTIVE209=null;
+		ParserRuleReturnScope annotation208 =null;
+
+		CommonTree PARAMETER_DIRECTIVE204_tree=null;
+		CommonTree REGISTER205_tree=null;
+		CommonTree COMMA206_tree=null;
+		CommonTree STRING_LITERAL207_tree=null;
+		CommonTree END_PARAMETER_DIRECTIVE209_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_PARAMETER_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token PARAMETER_DIRECTIVE");
+		RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL");
+		RewriteRuleTokenStream stream_END_PARAMETER_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_PARAMETER_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_annotation=new RewriteRuleSubtreeStream(adaptor,"rule annotation");
+
+		List<CommonTree> annotations = new ArrayList<CommonTree>();
+		try {
+			// smaliParser.g:740:3: ( PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) )
+			// smaliParser.g:740:5: PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) )
+			{
+			PARAMETER_DIRECTIVE204=(Token)match(input,PARAMETER_DIRECTIVE,FOLLOW_PARAMETER_DIRECTIVE_in_parameter_directive3277);  
+			stream_PARAMETER_DIRECTIVE.add(PARAMETER_DIRECTIVE204);
+
+			REGISTER205=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_parameter_directive3279);  
+			stream_REGISTER.add(REGISTER205);
+
+			// smaliParser.g:740:34: ( COMMA STRING_LITERAL )?
+			int alt39=2;
+			int LA39_0 = input.LA(1);
+			if ( (LA39_0==COMMA) ) {
+				alt39=1;
+			}
+			switch (alt39) {
+				case 1 :
+					// smaliParser.g:740:35: COMMA STRING_LITERAL
+					{
+					COMMA206=(Token)match(input,COMMA,FOLLOW_COMMA_in_parameter_directive3282);  
+					stream_COMMA.add(COMMA206);
+
+					STRING_LITERAL207=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_parameter_directive3284);  
+					stream_STRING_LITERAL.add(STRING_LITERAL207);
+
+					}
+					break;
+
+			}
+
+			// smaliParser.g:741:5: ({...}? annotation )*
+			loop40:
+			while (true) {
+				int alt40=2;
+				alt40 = dfa40.predict(input);
+				switch (alt40) {
+				case 1 :
+					// smaliParser.g:741:6: {...}? annotation
+					{
+					if ( !((input.LA(1) == ANNOTATION_DIRECTIVE)) ) {
+						throw new FailedPredicateException(input, "parameter_directive", "input.LA(1) == ANNOTATION_DIRECTIVE");
+					}
+					pushFollow(FOLLOW_annotation_in_parameter_directive3295);
+					annotation208=annotation();
+					state._fsp--;
+
+					stream_annotation.add(annotation208.getTree());
+					annotations.add((annotation208!=null?((CommonTree)annotation208.getTree()):null));
+					}
+					break;
+
+				default :
+					break loop40;
+				}
+			}
+
+			// smaliParser.g:743:5: ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) )
+			int alt41=2;
+			int LA41_0 = input.LA(1);
+			if ( (LA41_0==END_PARAMETER_DIRECTIVE) ) {
+				alt41=1;
+			}
+			else if ( (LA41_0==ANNOTATION_DIRECTIVE||LA41_0==ARRAY_DATA_DIRECTIVE||(LA41_0 >= CATCHALL_DIRECTIVE && LA41_0 <= CATCH_DIRECTIVE)||LA41_0==COLON||(LA41_0 >= END_LOCAL_DIRECTIVE && LA41_0 <= END_METHOD_DIRECTIVE)||LA41_0==EPILOGUE_DIRECTIVE||(LA41_0 >= INSTRUCTION_FORMAT10t && LA41_0 <= INSTRUCTION_FORMAT51l)||(LA41_0 >= LINE_DIRECTIVE && LA41_0 <= LOCAL_DIRECTIVE)||(LA41_0 >= PACKED_SWITCH_DIRECTIVE && LA41_0 <= PARAMETER_DIRECTIVE)||LA41_0==PROLOGUE_DIRECTIVE||(LA41_0 >= REGISTERS_DIRECTIVE && LA41_0 <= RESTART_LOCAL_DIRECTIVE)||(LA41_0 >= SOURCE_DIRECTIVE && LA41_0 <= SPARSE_SWITCH_DIRECTIVE)) ) {
+				alt41=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 41, 0, input);
+				throw nvae;
+			}
+
+			switch (alt41) {
+				case 1 :
+					// smaliParser.g:743:7: END_PARAMETER_DIRECTIVE
+					{
+					END_PARAMETER_DIRECTIVE209=(Token)match(input,END_PARAMETER_DIRECTIVE,FOLLOW_END_PARAMETER_DIRECTIVE_in_parameter_directive3308);  
+					stream_END_PARAMETER_DIRECTIVE.add(END_PARAMETER_DIRECTIVE209);
+
+					// AST REWRITE
+					// elements: STRING_LITERAL, annotation, REGISTER
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 744:7: -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) )
+					{
+						// smaliParser.g:744:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) )
+						{
+						CommonTree root_1 = (CommonTree)adaptor.nil();
+						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PARAMETER, (retval.start), "I_PARAMETER"), root_1);
+						adaptor.addChild(root_1, stream_REGISTER.nextNode());
+						// smaliParser.g:744:56: ( STRING_LITERAL )?
+						if ( stream_STRING_LITERAL.hasNext() ) {
+							adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode());
+						}
+						stream_STRING_LITERAL.reset();
+
+						// smaliParser.g:744:72: ^( I_ANNOTATIONS ( annotation )* )
+						{
+						CommonTree root_2 = (CommonTree)adaptor.nil();
+						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2);
+						// smaliParser.g:744:88: ( annotation )*
+						while ( stream_annotation.hasNext() ) {
+							adaptor.addChild(root_2, stream_annotation.nextTree());
+						}
+						stream_annotation.reset();
+
+						adaptor.addChild(root_1, root_2);
+						}
+
+						adaptor.addChild(root_0, root_1);
+						}
+
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:745:19: 
+					{
+					statements_and_directives_stack.peek().methodAnnotations.addAll(annotations);
+					// AST REWRITE
+					// elements: STRING_LITERAL, REGISTER
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 746:7: -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) )
+					{
+						// smaliParser.g:746:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) )
+						{
+						CommonTree root_1 = (CommonTree)adaptor.nil();
+						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PARAMETER, (retval.start), "I_PARAMETER"), root_1);
+						adaptor.addChild(root_1, stream_REGISTER.nextNode());
+						// smaliParser.g:746:56: ( STRING_LITERAL )?
+						if ( stream_STRING_LITERAL.hasNext() ) {
+							adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode());
+						}
+						stream_STRING_LITERAL.reset();
+
+						// smaliParser.g:746:72: ^( I_ANNOTATIONS )
+						{
+						CommonTree root_2 = (CommonTree)adaptor.nil();
+						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2);
+						adaptor.addChild(root_1, root_2);
+						}
+
+						adaptor.addChild(root_0, root_1);
+						}
+
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "parameter_directive"
+
+
+	public static class debug_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "debug_directive"
+	// smaliParser.g:749:1: debug_directive : ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive );
+	public final smaliParser.debug_directive_return debug_directive() throws RecognitionException {
+		smaliParser.debug_directive_return retval = new smaliParser.debug_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		ParserRuleReturnScope line_directive210 =null;
+		ParserRuleReturnScope local_directive211 =null;
+		ParserRuleReturnScope end_local_directive212 =null;
+		ParserRuleReturnScope restart_local_directive213 =null;
+		ParserRuleReturnScope prologue_directive214 =null;
+		ParserRuleReturnScope epilogue_directive215 =null;
+		ParserRuleReturnScope source_directive216 =null;
+
+
+		try {
+			// smaliParser.g:750:3: ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive )
+			int alt42=7;
+			switch ( input.LA(1) ) {
+			case LINE_DIRECTIVE:
+				{
+				alt42=1;
+				}
+				break;
+			case LOCAL_DIRECTIVE:
+				{
+				alt42=2;
+				}
+				break;
+			case END_LOCAL_DIRECTIVE:
+				{
+				alt42=3;
+				}
+				break;
+			case RESTART_LOCAL_DIRECTIVE:
+				{
+				alt42=4;
+				}
+				break;
+			case PROLOGUE_DIRECTIVE:
+				{
+				alt42=5;
+				}
+				break;
+			case EPILOGUE_DIRECTIVE:
+				{
+				alt42=6;
+				}
+				break;
+			case SOURCE_DIRECTIVE:
+				{
+				alt42=7;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 42, 0, input);
+				throw nvae;
+			}
+			switch (alt42) {
+				case 1 :
+					// smaliParser.g:750:5: line_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_line_directive_in_debug_directive3381);
+					line_directive210=line_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, line_directive210.getTree());
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:751:5: local_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_local_directive_in_debug_directive3387);
+					local_directive211=local_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, local_directive211.getTree());
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:752:5: end_local_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_end_local_directive_in_debug_directive3393);
+					end_local_directive212=end_local_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, end_local_directive212.getTree());
+
+					}
+					break;
+				case 4 :
+					// smaliParser.g:753:5: restart_local_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_restart_local_directive_in_debug_directive3399);
+					restart_local_directive213=restart_local_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, restart_local_directive213.getTree());
+
+					}
+					break;
+				case 5 :
+					// smaliParser.g:754:5: prologue_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_prologue_directive_in_debug_directive3405);
+					prologue_directive214=prologue_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, prologue_directive214.getTree());
+
+					}
+					break;
+				case 6 :
+					// smaliParser.g:755:5: epilogue_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_epilogue_directive_in_debug_directive3411);
+					epilogue_directive215=epilogue_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, epilogue_directive215.getTree());
+
+					}
+					break;
+				case 7 :
+					// smaliParser.g:756:5: source_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_source_directive_in_debug_directive3417);
+					source_directive216=source_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, source_directive216.getTree());
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "debug_directive"
+
+
+	public static class line_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "line_directive"
+	// smaliParser.g:758:1: line_directive : LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) ;
+	public final smaliParser.line_directive_return line_directive() throws RecognitionException {
+		smaliParser.line_directive_return retval = new smaliParser.line_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token LINE_DIRECTIVE217=null;
+		ParserRuleReturnScope integral_literal218 =null;
+
+		CommonTree LINE_DIRECTIVE217_tree=null;
+		RewriteRuleTokenStream stream_LINE_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token LINE_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
+
+		try {
+			// smaliParser.g:759:3: ( LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) )
+			// smaliParser.g:759:5: LINE_DIRECTIVE integral_literal
+			{
+			LINE_DIRECTIVE217=(Token)match(input,LINE_DIRECTIVE,FOLLOW_LINE_DIRECTIVE_in_line_directive3427);  
+			stream_LINE_DIRECTIVE.add(LINE_DIRECTIVE217);
+
+			pushFollow(FOLLOW_integral_literal_in_line_directive3429);
+			integral_literal218=integral_literal();
+			state._fsp--;
+
+			stream_integral_literal.add(integral_literal218.getTree());
+			// AST REWRITE
+			// elements: integral_literal
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 760:5: -> ^( I_LINE[$start, \"I_LINE\"] integral_literal )
+			{
+				// smaliParser.g:760:8: ^( I_LINE[$start, \"I_LINE\"] integral_literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LINE, (retval.start), "I_LINE"), root_1);
+				adaptor.addChild(root_1, stream_integral_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "line_directive"
+
+
+	public static class local_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "local_directive"
+	// smaliParser.g:762:1: local_directive : LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) ;
+	public final smaliParser.local_directive_return local_directive() throws RecognitionException {
+		smaliParser.local_directive_return retval = new smaliParser.local_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token name=null;
+		Token signature=null;
+		Token LOCAL_DIRECTIVE219=null;
+		Token REGISTER220=null;
+		Token COMMA221=null;
+		Token NULL_LITERAL222=null;
+		Token COLON223=null;
+		Token VOID_TYPE224=null;
+		Token COMMA226=null;
+		ParserRuleReturnScope nonvoid_type_descriptor225 =null;
+
+		CommonTree name_tree=null;
+		CommonTree signature_tree=null;
+		CommonTree LOCAL_DIRECTIVE219_tree=null;
+		CommonTree REGISTER220_tree=null;
+		CommonTree COMMA221_tree=null;
+		CommonTree NULL_LITERAL222_tree=null;
+		CommonTree COLON223_tree=null;
+		CommonTree VOID_TYPE224_tree=null;
+		CommonTree COMMA226_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_LOCAL_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token LOCAL_DIRECTIVE");
+		RewriteRuleTokenStream stream_VOID_TYPE=new RewriteRuleTokenStream(adaptor,"token VOID_TYPE");
+		RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL");
+		RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
+		RewriteRuleTokenStream stream_NULL_LITERAL=new RewriteRuleTokenStream(adaptor,"token NULL_LITERAL");
+		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
+
+		try {
+			// smaliParser.g:763:3: ( LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) )
+			// smaliParser.g:763:5: LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )?
+			{
+			LOCAL_DIRECTIVE219=(Token)match(input,LOCAL_DIRECTIVE,FOLLOW_LOCAL_DIRECTIVE_in_local_directive3452);  
+			stream_LOCAL_DIRECTIVE.add(LOCAL_DIRECTIVE219);
+
+			REGISTER220=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_local_directive3454);  
+			stream_REGISTER.add(REGISTER220);
+
+			// smaliParser.g:763:30: ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )?
+			int alt46=2;
+			int LA46_0 = input.LA(1);
+			if ( (LA46_0==COMMA) ) {
+				alt46=1;
+			}
+			switch (alt46) {
+				case 1 :
+					// smaliParser.g:763:31: COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )?
+					{
+					COMMA221=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3457);  
+					stream_COMMA.add(COMMA221);
+
+					// smaliParser.g:763:37: ( NULL_LITERAL |name= STRING_LITERAL )
+					int alt43=2;
+					int LA43_0 = input.LA(1);
+					if ( (LA43_0==NULL_LITERAL) ) {
+						alt43=1;
+					}
+					else if ( (LA43_0==STRING_LITERAL) ) {
+						alt43=2;
+					}
+
+					else {
+						NoViableAltException nvae =
+							new NoViableAltException("", 43, 0, input);
+						throw nvae;
+					}
+
+					switch (alt43) {
+						case 1 :
+							// smaliParser.g:763:38: NULL_LITERAL
+							{
+							NULL_LITERAL222=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local_directive3460);  
+							stream_NULL_LITERAL.add(NULL_LITERAL222);
+
+							}
+							break;
+						case 2 :
+							// smaliParser.g:763:53: name= STRING_LITERAL
+							{
+							name=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3466);  
+							stream_STRING_LITERAL.add(name);
+
+							}
+							break;
+
+					}
+
+					COLON223=(Token)match(input,COLON,FOLLOW_COLON_in_local_directive3469);  
+					stream_COLON.add(COLON223);
+
+					// smaliParser.g:763:80: ( VOID_TYPE | nonvoid_type_descriptor )
+					int alt44=2;
+					int LA44_0 = input.LA(1);
+					if ( (LA44_0==VOID_TYPE) ) {
+						alt44=1;
+					}
+					else if ( (LA44_0==ARRAY_TYPE_PREFIX||LA44_0==CLASS_DESCRIPTOR||LA44_0==PRIMITIVE_TYPE) ) {
+						alt44=2;
+					}
+
+					else {
+						NoViableAltException nvae =
+							new NoViableAltException("", 44, 0, input);
+						throw nvae;
+					}
+
+					switch (alt44) {
+						case 1 :
+							// smaliParser.g:763:81: VOID_TYPE
+							{
+							VOID_TYPE224=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_local_directive3472);  
+							stream_VOID_TYPE.add(VOID_TYPE224);
+
+							}
+							break;
+						case 2 :
+							// smaliParser.g:763:93: nonvoid_type_descriptor
+							{
+							pushFollow(FOLLOW_nonvoid_type_descriptor_in_local_directive3476);
+							nonvoid_type_descriptor225=nonvoid_type_descriptor();
+							state._fsp--;
+
+							stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor225.getTree());
+							}
+							break;
+
+					}
+
+					// smaliParser.g:764:31: ( COMMA signature= STRING_LITERAL )?
+					int alt45=2;
+					int LA45_0 = input.LA(1);
+					if ( (LA45_0==COMMA) ) {
+						alt45=1;
+					}
+					switch (alt45) {
+						case 1 :
+							// smaliParser.g:764:32: COMMA signature= STRING_LITERAL
+							{
+							COMMA226=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3510);  
+							stream_COMMA.add(COMMA226);
+
+							signature=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3514);  
+							stream_STRING_LITERAL.add(signature);
+
+							}
+							break;
+
+					}
+
+					}
+					break;
+
+			}
+
+			// AST REWRITE
+			// elements: name, NULL_LITERAL, nonvoid_type_descriptor, REGISTER, signature
+			// token labels: signature, name
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleTokenStream stream_signature=new RewriteRuleTokenStream(adaptor,"token signature",signature);
+			RewriteRuleTokenStream stream_name=new RewriteRuleTokenStream(adaptor,"token name",name);
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 765:5: -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? )
+			{
+				// smaliParser.g:765:8: ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LOCAL, (retval.start), "I_LOCAL"), root_1);
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				// smaliParser.g:765:46: ( NULL_LITERAL )?
+				if ( stream_NULL_LITERAL.hasNext() ) {
+					adaptor.addChild(root_1, stream_NULL_LITERAL.nextNode());
+				}
+				stream_NULL_LITERAL.reset();
+
+				// smaliParser.g:765:61: ( $name)?
+				if ( stream_name.hasNext() ) {
+					adaptor.addChild(root_1, stream_name.nextNode());
+				}
+				stream_name.reset();
+
+				// smaliParser.g:765:67: ( nonvoid_type_descriptor )?
+				if ( stream_nonvoid_type_descriptor.hasNext() ) {
+					adaptor.addChild(root_1, stream_nonvoid_type_descriptor.nextTree());
+				}
+				stream_nonvoid_type_descriptor.reset();
+
+				// smaliParser.g:765:93: ( $signature)?
+				if ( stream_signature.hasNext() ) {
+					adaptor.addChild(root_1, stream_signature.nextNode());
+				}
+				stream_signature.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "local_directive"
+
+
+	public static class end_local_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "end_local_directive"
+	// smaliParser.g:767:1: end_local_directive : END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) ;
+	public final smaliParser.end_local_directive_return end_local_directive() throws RecognitionException {
+		smaliParser.end_local_directive_return retval = new smaliParser.end_local_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token END_LOCAL_DIRECTIVE227=null;
+		Token REGISTER228=null;
+
+		CommonTree END_LOCAL_DIRECTIVE227_tree=null;
+		CommonTree REGISTER228_tree=null;
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_END_LOCAL_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_LOCAL_DIRECTIVE");
+
+		try {
+			// smaliParser.g:768:3: ( END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) )
+			// smaliParser.g:768:5: END_LOCAL_DIRECTIVE REGISTER
+			{
+			END_LOCAL_DIRECTIVE227=(Token)match(input,END_LOCAL_DIRECTIVE,FOLLOW_END_LOCAL_DIRECTIVE_in_end_local_directive3556);  
+			stream_END_LOCAL_DIRECTIVE.add(END_LOCAL_DIRECTIVE227);
+
+			REGISTER228=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_end_local_directive3558);  
+			stream_REGISTER.add(REGISTER228);
+
+			// AST REWRITE
+			// elements: REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 769:5: -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER )
+			{
+				// smaliParser.g:769:8: ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_END_LOCAL, (retval.start), "I_END_LOCAL"), root_1);
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "end_local_directive"
+
+
+	public static class restart_local_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "restart_local_directive"
+	// smaliParser.g:771:1: restart_local_directive : RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) ;
+	public final smaliParser.restart_local_directive_return restart_local_directive() throws RecognitionException {
+		smaliParser.restart_local_directive_return retval = new smaliParser.restart_local_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token RESTART_LOCAL_DIRECTIVE229=null;
+		Token REGISTER230=null;
+
+		CommonTree RESTART_LOCAL_DIRECTIVE229_tree=null;
+		CommonTree REGISTER230_tree=null;
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_RESTART_LOCAL_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token RESTART_LOCAL_DIRECTIVE");
+
+		try {
+			// smaliParser.g:772:3: ( RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) )
+			// smaliParser.g:772:5: RESTART_LOCAL_DIRECTIVE REGISTER
+			{
+			RESTART_LOCAL_DIRECTIVE229=(Token)match(input,RESTART_LOCAL_DIRECTIVE,FOLLOW_RESTART_LOCAL_DIRECTIVE_in_restart_local_directive3581);  
+			stream_RESTART_LOCAL_DIRECTIVE.add(RESTART_LOCAL_DIRECTIVE229);
+
+			REGISTER230=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local_directive3583);  
+			stream_REGISTER.add(REGISTER230);
+
+			// AST REWRITE
+			// elements: REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 773:5: -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER )
+			{
+				// smaliParser.g:773:8: ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_RESTART_LOCAL, (retval.start), "I_RESTART_LOCAL"), root_1);
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "restart_local_directive"
+
+
+	public static class prologue_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "prologue_directive"
+	// smaliParser.g:775:1: prologue_directive : PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) ;
+	public final smaliParser.prologue_directive_return prologue_directive() throws RecognitionException {
+		smaliParser.prologue_directive_return retval = new smaliParser.prologue_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token PROLOGUE_DIRECTIVE231=null;
+
+		CommonTree PROLOGUE_DIRECTIVE231_tree=null;
+		RewriteRuleTokenStream stream_PROLOGUE_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token PROLOGUE_DIRECTIVE");
+
+		try {
+			// smaliParser.g:776:3: ( PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) )
+			// smaliParser.g:776:5: PROLOGUE_DIRECTIVE
+			{
+			PROLOGUE_DIRECTIVE231=(Token)match(input,PROLOGUE_DIRECTIVE,FOLLOW_PROLOGUE_DIRECTIVE_in_prologue_directive3606);  
+			stream_PROLOGUE_DIRECTIVE.add(PROLOGUE_DIRECTIVE231);
+
+			// AST REWRITE
+			// elements: 
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 777:5: -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] )
+			{
+				// smaliParser.g:777:8: ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PROLOGUE, (retval.start), "I_PROLOGUE"), root_1);
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "prologue_directive"
+
+
+	public static class epilogue_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "epilogue_directive"
+	// smaliParser.g:779:1: epilogue_directive : EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) ;
+	public final smaliParser.epilogue_directive_return epilogue_directive() throws RecognitionException {
+		smaliParser.epilogue_directive_return retval = new smaliParser.epilogue_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token EPILOGUE_DIRECTIVE232=null;
+
+		CommonTree EPILOGUE_DIRECTIVE232_tree=null;
+		RewriteRuleTokenStream stream_EPILOGUE_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token EPILOGUE_DIRECTIVE");
+
+		try {
+			// smaliParser.g:780:3: ( EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) )
+			// smaliParser.g:780:5: EPILOGUE_DIRECTIVE
+			{
+			EPILOGUE_DIRECTIVE232=(Token)match(input,EPILOGUE_DIRECTIVE,FOLLOW_EPILOGUE_DIRECTIVE_in_epilogue_directive3627);  
+			stream_EPILOGUE_DIRECTIVE.add(EPILOGUE_DIRECTIVE232);
+
+			// AST REWRITE
+			// elements: 
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 781:5: -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] )
+			{
+				// smaliParser.g:781:8: ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_EPILOGUE, (retval.start), "I_EPILOGUE"), root_1);
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "epilogue_directive"
+
+
+	public static class source_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "source_directive"
+	// smaliParser.g:783:1: source_directive : SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) ;
+	public final smaliParser.source_directive_return source_directive() throws RecognitionException {
+		smaliParser.source_directive_return retval = new smaliParser.source_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token SOURCE_DIRECTIVE233=null;
+		Token STRING_LITERAL234=null;
+
+		CommonTree SOURCE_DIRECTIVE233_tree=null;
+		CommonTree STRING_LITERAL234_tree=null;
+		RewriteRuleTokenStream stream_SOURCE_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token SOURCE_DIRECTIVE");
+		RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL");
+
+		try {
+			// smaliParser.g:784:3: ( SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) )
+			// smaliParser.g:784:5: SOURCE_DIRECTIVE ( STRING_LITERAL )?
+			{
+			SOURCE_DIRECTIVE233=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_directive3648);  
+			stream_SOURCE_DIRECTIVE.add(SOURCE_DIRECTIVE233);
+
+			// smaliParser.g:784:22: ( STRING_LITERAL )?
+			int alt47=2;
+			int LA47_0 = input.LA(1);
+			if ( (LA47_0==STRING_LITERAL) ) {
+				alt47=1;
+			}
+			switch (alt47) {
+				case 1 :
+					// smaliParser.g:784:22: STRING_LITERAL
+					{
+					STRING_LITERAL234=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_directive3650);  
+					stream_STRING_LITERAL.add(STRING_LITERAL234);
+
+					}
+					break;
+
+			}
+
+			// AST REWRITE
+			// elements: STRING_LITERAL
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 785:5: -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? )
+			{
+				// smaliParser.g:785:8: ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SOURCE, (retval.start), "I_SOURCE"), root_1);
+				// smaliParser.g:785:39: ( STRING_LITERAL )?
+				if ( stream_STRING_LITERAL.hasNext() ) {
+					adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode());
+				}
+				stream_STRING_LITERAL.reset();
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "source_directive"
+
+
+	public static class instruction_format12x_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "instruction_format12x"
+	// smaliParser.g:787:1: instruction_format12x : ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] );
+	public final smaliParser.instruction_format12x_return instruction_format12x() throws RecognitionException {
+		smaliParser.instruction_format12x_return retval = new smaliParser.instruction_format12x_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT12x235=null;
+		Token INSTRUCTION_FORMAT12x_OR_ID236=null;
+
+		CommonTree INSTRUCTION_FORMAT12x235_tree=null;
+		CommonTree INSTRUCTION_FORMAT12x_OR_ID236_tree=null;
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT12x_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT12x_OR_ID");
+
+		try {
+			// smaliParser.g:788:3: ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] )
+			int alt48=2;
+			int LA48_0 = input.LA(1);
+			if ( (LA48_0==INSTRUCTION_FORMAT12x) ) {
+				alt48=1;
+			}
+			else if ( (LA48_0==INSTRUCTION_FORMAT12x_OR_ID) ) {
+				alt48=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 48, 0, input);
+				throw nvae;
+			}
+
+			switch (alt48) {
+				case 1 :
+					// smaliParser.g:788:5: INSTRUCTION_FORMAT12x
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					INSTRUCTION_FORMAT12x235=(Token)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_instruction_format12x3675); 
+					INSTRUCTION_FORMAT12x235_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT12x235);
+					adaptor.addChild(root_0, INSTRUCTION_FORMAT12x235_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:789:5: INSTRUCTION_FORMAT12x_OR_ID
+					{
+					INSTRUCTION_FORMAT12x_OR_ID236=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_instruction_format12x3681);  
+					stream_INSTRUCTION_FORMAT12x_OR_ID.add(INSTRUCTION_FORMAT12x_OR_ID236);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 789:33: -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(INSTRUCTION_FORMAT12x, INSTRUCTION_FORMAT12x_OR_ID236));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "instruction_format12x"
+
+
+	public static class instruction_format22s_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "instruction_format22s"
+	// smaliParser.g:791:1: instruction_format22s : ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] );
+	public final smaliParser.instruction_format22s_return instruction_format22s() throws RecognitionException {
+		smaliParser.instruction_format22s_return retval = new smaliParser.instruction_format22s_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT22s237=null;
+		Token INSTRUCTION_FORMAT22s_OR_ID238=null;
+
+		CommonTree INSTRUCTION_FORMAT22s237_tree=null;
+		CommonTree INSTRUCTION_FORMAT22s_OR_ID238_tree=null;
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22s_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22s_OR_ID");
+
+		try {
+			// smaliParser.g:792:3: ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] )
+			int alt49=2;
+			int LA49_0 = input.LA(1);
+			if ( (LA49_0==INSTRUCTION_FORMAT22s) ) {
+				alt49=1;
+			}
+			else if ( (LA49_0==INSTRUCTION_FORMAT22s_OR_ID) ) {
+				alt49=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 49, 0, input);
+				throw nvae;
+			}
+
+			switch (alt49) {
+				case 1 :
+					// smaliParser.g:792:5: INSTRUCTION_FORMAT22s
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					INSTRUCTION_FORMAT22s237=(Token)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_instruction_format22s3696); 
+					INSTRUCTION_FORMAT22s237_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT22s237);
+					adaptor.addChild(root_0, INSTRUCTION_FORMAT22s237_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:793:5: INSTRUCTION_FORMAT22s_OR_ID
+					{
+					INSTRUCTION_FORMAT22s_OR_ID238=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_instruction_format22s3702);  
+					stream_INSTRUCTION_FORMAT22s_OR_ID.add(INSTRUCTION_FORMAT22s_OR_ID238);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 793:33: -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(INSTRUCTION_FORMAT22s, INSTRUCTION_FORMAT22s_OR_ID238));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "instruction_format22s"
+
+
+	public static class instruction_format31i_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "instruction_format31i"
+	// smaliParser.g:795:1: instruction_format31i : ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] );
+	public final smaliParser.instruction_format31i_return instruction_format31i() throws RecognitionException {
+		smaliParser.instruction_format31i_return retval = new smaliParser.instruction_format31i_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT31i239=null;
+		Token INSTRUCTION_FORMAT31i_OR_ID240=null;
+
+		CommonTree INSTRUCTION_FORMAT31i239_tree=null;
+		CommonTree INSTRUCTION_FORMAT31i_OR_ID240_tree=null;
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT31i_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT31i_OR_ID");
+
+		try {
+			// smaliParser.g:796:3: ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] )
+			int alt50=2;
+			int LA50_0 = input.LA(1);
+			if ( (LA50_0==INSTRUCTION_FORMAT31i) ) {
+				alt50=1;
+			}
+			else if ( (LA50_0==INSTRUCTION_FORMAT31i_OR_ID) ) {
+				alt50=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 50, 0, input);
+				throw nvae;
+			}
+
+			switch (alt50) {
+				case 1 :
+					// smaliParser.g:796:5: INSTRUCTION_FORMAT31i
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					INSTRUCTION_FORMAT31i239=(Token)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_instruction_format31i3717); 
+					INSTRUCTION_FORMAT31i239_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT31i239);
+					adaptor.addChild(root_0, INSTRUCTION_FORMAT31i239_tree);
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:797:5: INSTRUCTION_FORMAT31i_OR_ID
+					{
+					INSTRUCTION_FORMAT31i_OR_ID240=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_instruction_format31i3723);  
+					stream_INSTRUCTION_FORMAT31i_OR_ID.add(INSTRUCTION_FORMAT31i_OR_ID240);
+
+					// AST REWRITE
+					// elements: 
+					// token labels: 
+					// rule labels: retval
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
+					retval.tree = root_0;
+					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+					root_0 = (CommonTree)adaptor.nil();
+					// 797:33: -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID]
+					{
+						adaptor.addChild(root_0, (CommonTree)adaptor.create(INSTRUCTION_FORMAT31i, INSTRUCTION_FORMAT31i_OR_ID240));
+					}
+
+
+					retval.tree = root_0;
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "instruction_format31i"
+
+
+	public static class instruction_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "instruction"
+	// smaliParser.g:801:1: instruction : ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive );
+	public final smaliParser.instruction_return instruction() throws RecognitionException {
+		smaliParser.instruction_return retval = new smaliParser.instruction_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		ParserRuleReturnScope insn_format10t241 =null;
+		ParserRuleReturnScope insn_format10x242 =null;
+		ParserRuleReturnScope insn_format10x_odex243 =null;
+		ParserRuleReturnScope insn_format11n244 =null;
+		ParserRuleReturnScope insn_format11x245 =null;
+		ParserRuleReturnScope insn_format12x246 =null;
+		ParserRuleReturnScope insn_format20bc247 =null;
+		ParserRuleReturnScope insn_format20t248 =null;
+		ParserRuleReturnScope insn_format21c_field249 =null;
+		ParserRuleReturnScope insn_format21c_field_odex250 =null;
+		ParserRuleReturnScope insn_format21c_string251 =null;
+		ParserRuleReturnScope insn_format21c_type252 =null;
+		ParserRuleReturnScope insn_format21ih253 =null;
+		ParserRuleReturnScope insn_format21lh254 =null;
+		ParserRuleReturnScope insn_format21s255 =null;
+		ParserRuleReturnScope insn_format21t256 =null;
+		ParserRuleReturnScope insn_format22b257 =null;
+		ParserRuleReturnScope insn_format22c_field258 =null;
+		ParserRuleReturnScope insn_format22c_field_odex259 =null;
+		ParserRuleReturnScope insn_format22c_type260 =null;
+		ParserRuleReturnScope insn_format22cs_field261 =null;
+		ParserRuleReturnScope insn_format22s262 =null;
+		ParserRuleReturnScope insn_format22t263 =null;
+		ParserRuleReturnScope insn_format22x264 =null;
+		ParserRuleReturnScope insn_format23x265 =null;
+		ParserRuleReturnScope insn_format30t266 =null;
+		ParserRuleReturnScope insn_format31c267 =null;
+		ParserRuleReturnScope insn_format31i268 =null;
+		ParserRuleReturnScope insn_format31t269 =null;
+		ParserRuleReturnScope insn_format32x270 =null;
+		ParserRuleReturnScope insn_format35c_method271 =null;
+		ParserRuleReturnScope insn_format35c_type272 =null;
+		ParserRuleReturnScope insn_format35c_method_odex273 =null;
+		ParserRuleReturnScope insn_format35mi_method274 =null;
+		ParserRuleReturnScope insn_format35ms_method275 =null;
+		ParserRuleReturnScope insn_format3rc_method276 =null;
+		ParserRuleReturnScope insn_format3rc_method_odex277 =null;
+		ParserRuleReturnScope insn_format3rc_type278 =null;
+		ParserRuleReturnScope insn_format3rmi_method279 =null;
+		ParserRuleReturnScope insn_format3rms_method280 =null;
+		ParserRuleReturnScope insn_format45cc_method281 =null;
+		ParserRuleReturnScope insn_format4rcc_method282 =null;
+		ParserRuleReturnScope insn_format51l283 =null;
+		ParserRuleReturnScope insn_array_data_directive284 =null;
+		ParserRuleReturnScope insn_packed_switch_directive285 =null;
+		ParserRuleReturnScope insn_sparse_switch_directive286 =null;
+
+
+		try {
+			// smaliParser.g:802:3: ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive )
+			int alt51=46;
+			switch ( input.LA(1) ) {
+			case INSTRUCTION_FORMAT10t:
+				{
+				alt51=1;
+				}
+				break;
+			case INSTRUCTION_FORMAT10x:
+				{
+				alt51=2;
+				}
+				break;
+			case INSTRUCTION_FORMAT10x_ODEX:
+				{
+				alt51=3;
+				}
+				break;
+			case INSTRUCTION_FORMAT11n:
+				{
+				alt51=4;
+				}
+				break;
+			case INSTRUCTION_FORMAT11x:
+				{
+				alt51=5;
+				}
+				break;
+			case INSTRUCTION_FORMAT12x:
+			case INSTRUCTION_FORMAT12x_OR_ID:
+				{
+				alt51=6;
+				}
+				break;
+			case INSTRUCTION_FORMAT20bc:
+				{
+				alt51=7;
+				}
+				break;
+			case INSTRUCTION_FORMAT20t:
+				{
+				alt51=8;
+				}
+				break;
+			case INSTRUCTION_FORMAT21c_FIELD:
+				{
+				alt51=9;
+				}
+				break;
+			case INSTRUCTION_FORMAT21c_FIELD_ODEX:
+				{
+				alt51=10;
+				}
+				break;
+			case INSTRUCTION_FORMAT21c_STRING:
+				{
+				alt51=11;
+				}
+				break;
+			case INSTRUCTION_FORMAT21c_TYPE:
+				{
+				alt51=12;
+				}
+				break;
+			case INSTRUCTION_FORMAT21ih:
+				{
+				alt51=13;
+				}
+				break;
+			case INSTRUCTION_FORMAT21lh:
+				{
+				alt51=14;
+				}
+				break;
+			case INSTRUCTION_FORMAT21s:
+				{
+				alt51=15;
+				}
+				break;
+			case INSTRUCTION_FORMAT21t:
+				{
+				alt51=16;
+				}
+				break;
+			case INSTRUCTION_FORMAT22b:
+				{
+				alt51=17;
+				}
+				break;
+			case INSTRUCTION_FORMAT22c_FIELD:
+				{
+				alt51=18;
+				}
+				break;
+			case INSTRUCTION_FORMAT22c_FIELD_ODEX:
+				{
+				alt51=19;
+				}
+				break;
+			case INSTRUCTION_FORMAT22c_TYPE:
+				{
+				alt51=20;
+				}
+				break;
+			case INSTRUCTION_FORMAT22cs_FIELD:
+				{
+				alt51=21;
+				}
+				break;
+			case INSTRUCTION_FORMAT22s:
+			case INSTRUCTION_FORMAT22s_OR_ID:
+				{
+				alt51=22;
+				}
+				break;
+			case INSTRUCTION_FORMAT22t:
+				{
+				alt51=23;
+				}
+				break;
+			case INSTRUCTION_FORMAT22x:
+				{
+				alt51=24;
+				}
+				break;
+			case INSTRUCTION_FORMAT23x:
+				{
+				alt51=25;
+				}
+				break;
+			case INSTRUCTION_FORMAT30t:
+				{
+				alt51=26;
+				}
+				break;
+			case INSTRUCTION_FORMAT31c:
+				{
+				alt51=27;
+				}
+				break;
+			case INSTRUCTION_FORMAT31i:
+			case INSTRUCTION_FORMAT31i_OR_ID:
+				{
+				alt51=28;
+				}
+				break;
+			case INSTRUCTION_FORMAT31t:
+				{
+				alt51=29;
+				}
+				break;
+			case INSTRUCTION_FORMAT32x:
+				{
+				alt51=30;
+				}
+				break;
+			case INSTRUCTION_FORMAT35c_METHOD:
+				{
+				alt51=31;
+				}
+				break;
+			case INSTRUCTION_FORMAT35c_TYPE:
+				{
+				alt51=32;
+				}
+				break;
+			case INSTRUCTION_FORMAT35c_METHOD_ODEX:
+				{
+				alt51=33;
+				}
+				break;
+			case INSTRUCTION_FORMAT35mi_METHOD:
+				{
+				alt51=34;
+				}
+				break;
+			case INSTRUCTION_FORMAT35ms_METHOD:
+				{
+				alt51=35;
+				}
+				break;
+			case INSTRUCTION_FORMAT3rc_METHOD:
+				{
+				alt51=36;
+				}
+				break;
+			case INSTRUCTION_FORMAT3rc_METHOD_ODEX:
+				{
+				alt51=37;
+				}
+				break;
+			case INSTRUCTION_FORMAT3rc_TYPE:
+				{
+				alt51=38;
+				}
+				break;
+			case INSTRUCTION_FORMAT3rmi_METHOD:
+				{
+				alt51=39;
+				}
+				break;
+			case INSTRUCTION_FORMAT3rms_METHOD:
+				{
+				alt51=40;
+				}
+				break;
+			case INSTRUCTION_FORMAT45cc_METHOD:
+				{
+				alt51=41;
+				}
+				break;
+			case INSTRUCTION_FORMAT4rcc_METHOD:
+				{
+				alt51=42;
+				}
+				break;
+			case INSTRUCTION_FORMAT51l:
+				{
+				alt51=43;
+				}
+				break;
+			case ARRAY_DATA_DIRECTIVE:
+				{
+				alt51=44;
+				}
+				break;
+			case PACKED_SWITCH_DIRECTIVE:
+				{
+				alt51=45;
+				}
+				break;
+			case SPARSE_SWITCH_DIRECTIVE:
+				{
+				alt51=46;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 51, 0, input);
+				throw nvae;
+			}
+			switch (alt51) {
+				case 1 :
+					// smaliParser.g:802:5: insn_format10t
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format10t_in_instruction3740);
+					insn_format10t241=insn_format10t();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format10t241.getTree());
+
+					}
+					break;
+				case 2 :
+					// smaliParser.g:803:5: insn_format10x
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format10x_in_instruction3746);
+					insn_format10x242=insn_format10x();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format10x242.getTree());
+
+					}
+					break;
+				case 3 :
+					// smaliParser.g:804:5: insn_format10x_odex
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format10x_odex_in_instruction3752);
+					insn_format10x_odex243=insn_format10x_odex();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format10x_odex243.getTree());
+
+					}
+					break;
+				case 4 :
+					// smaliParser.g:805:5: insn_format11n
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format11n_in_instruction3758);
+					insn_format11n244=insn_format11n();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format11n244.getTree());
+
+					}
+					break;
+				case 5 :
+					// smaliParser.g:806:5: insn_format11x
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format11x_in_instruction3764);
+					insn_format11x245=insn_format11x();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format11x245.getTree());
+
+					}
+					break;
+				case 6 :
+					// smaliParser.g:807:5: insn_format12x
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format12x_in_instruction3770);
+					insn_format12x246=insn_format12x();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format12x246.getTree());
+
+					}
+					break;
+				case 7 :
+					// smaliParser.g:808:5: insn_format20bc
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format20bc_in_instruction3776);
+					insn_format20bc247=insn_format20bc();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format20bc247.getTree());
+
+					}
+					break;
+				case 8 :
+					// smaliParser.g:809:5: insn_format20t
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format20t_in_instruction3782);
+					insn_format20t248=insn_format20t();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format20t248.getTree());
+
+					}
+					break;
+				case 9 :
+					// smaliParser.g:810:5: insn_format21c_field
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format21c_field_in_instruction3788);
+					insn_format21c_field249=insn_format21c_field();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format21c_field249.getTree());
+
+					}
+					break;
+				case 10 :
+					// smaliParser.g:811:5: insn_format21c_field_odex
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format21c_field_odex_in_instruction3794);
+					insn_format21c_field_odex250=insn_format21c_field_odex();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format21c_field_odex250.getTree());
+
+					}
+					break;
+				case 11 :
+					// smaliParser.g:812:5: insn_format21c_string
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format21c_string_in_instruction3800);
+					insn_format21c_string251=insn_format21c_string();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format21c_string251.getTree());
+
+					}
+					break;
+				case 12 :
+					// smaliParser.g:813:5: insn_format21c_type
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format21c_type_in_instruction3806);
+					insn_format21c_type252=insn_format21c_type();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format21c_type252.getTree());
+
+					}
+					break;
+				case 13 :
+					// smaliParser.g:814:5: insn_format21ih
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format21ih_in_instruction3812);
+					insn_format21ih253=insn_format21ih();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format21ih253.getTree());
+
+					}
+					break;
+				case 14 :
+					// smaliParser.g:815:5: insn_format21lh
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format21lh_in_instruction3818);
+					insn_format21lh254=insn_format21lh();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format21lh254.getTree());
+
+					}
+					break;
+				case 15 :
+					// smaliParser.g:816:5: insn_format21s
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format21s_in_instruction3824);
+					insn_format21s255=insn_format21s();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format21s255.getTree());
+
+					}
+					break;
+				case 16 :
+					// smaliParser.g:817:5: insn_format21t
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format21t_in_instruction3830);
+					insn_format21t256=insn_format21t();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format21t256.getTree());
+
+					}
+					break;
+				case 17 :
+					// smaliParser.g:818:5: insn_format22b
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format22b_in_instruction3836);
+					insn_format22b257=insn_format22b();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format22b257.getTree());
+
+					}
+					break;
+				case 18 :
+					// smaliParser.g:819:5: insn_format22c_field
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format22c_field_in_instruction3842);
+					insn_format22c_field258=insn_format22c_field();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format22c_field258.getTree());
+
+					}
+					break;
+				case 19 :
+					// smaliParser.g:820:5: insn_format22c_field_odex
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format22c_field_odex_in_instruction3848);
+					insn_format22c_field_odex259=insn_format22c_field_odex();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format22c_field_odex259.getTree());
+
+					}
+					break;
+				case 20 :
+					// smaliParser.g:821:5: insn_format22c_type
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format22c_type_in_instruction3854);
+					insn_format22c_type260=insn_format22c_type();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format22c_type260.getTree());
+
+					}
+					break;
+				case 21 :
+					// smaliParser.g:822:5: insn_format22cs_field
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format22cs_field_in_instruction3860);
+					insn_format22cs_field261=insn_format22cs_field();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format22cs_field261.getTree());
+
+					}
+					break;
+				case 22 :
+					// smaliParser.g:823:5: insn_format22s
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format22s_in_instruction3866);
+					insn_format22s262=insn_format22s();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format22s262.getTree());
+
+					}
+					break;
+				case 23 :
+					// smaliParser.g:824:5: insn_format22t
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format22t_in_instruction3872);
+					insn_format22t263=insn_format22t();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format22t263.getTree());
+
+					}
+					break;
+				case 24 :
+					// smaliParser.g:825:5: insn_format22x
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format22x_in_instruction3878);
+					insn_format22x264=insn_format22x();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format22x264.getTree());
+
+					}
+					break;
+				case 25 :
+					// smaliParser.g:826:5: insn_format23x
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format23x_in_instruction3884);
+					insn_format23x265=insn_format23x();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format23x265.getTree());
+
+					}
+					break;
+				case 26 :
+					// smaliParser.g:827:5: insn_format30t
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format30t_in_instruction3890);
+					insn_format30t266=insn_format30t();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format30t266.getTree());
+
+					}
+					break;
+				case 27 :
+					// smaliParser.g:828:5: insn_format31c
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format31c_in_instruction3896);
+					insn_format31c267=insn_format31c();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format31c267.getTree());
+
+					}
+					break;
+				case 28 :
+					// smaliParser.g:829:5: insn_format31i
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format31i_in_instruction3902);
+					insn_format31i268=insn_format31i();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format31i268.getTree());
+
+					}
+					break;
+				case 29 :
+					// smaliParser.g:830:5: insn_format31t
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format31t_in_instruction3908);
+					insn_format31t269=insn_format31t();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format31t269.getTree());
+
+					}
+					break;
+				case 30 :
+					// smaliParser.g:831:5: insn_format32x
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format32x_in_instruction3914);
+					insn_format32x270=insn_format32x();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format32x270.getTree());
+
+					}
+					break;
+				case 31 :
+					// smaliParser.g:832:5: insn_format35c_method
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format35c_method_in_instruction3920);
+					insn_format35c_method271=insn_format35c_method();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format35c_method271.getTree());
+
+					}
+					break;
+				case 32 :
+					// smaliParser.g:833:5: insn_format35c_type
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format35c_type_in_instruction3926);
+					insn_format35c_type272=insn_format35c_type();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format35c_type272.getTree());
+
+					}
+					break;
+				case 33 :
+					// smaliParser.g:834:5: insn_format35c_method_odex
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format35c_method_odex_in_instruction3932);
+					insn_format35c_method_odex273=insn_format35c_method_odex();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format35c_method_odex273.getTree());
+
+					}
+					break;
+				case 34 :
+					// smaliParser.g:835:5: insn_format35mi_method
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format35mi_method_in_instruction3938);
+					insn_format35mi_method274=insn_format35mi_method();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format35mi_method274.getTree());
+
+					}
+					break;
+				case 35 :
+					// smaliParser.g:836:5: insn_format35ms_method
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format35ms_method_in_instruction3944);
+					insn_format35ms_method275=insn_format35ms_method();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format35ms_method275.getTree());
+
+					}
+					break;
+				case 36 :
+					// smaliParser.g:837:5: insn_format3rc_method
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format3rc_method_in_instruction3950);
+					insn_format3rc_method276=insn_format3rc_method();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format3rc_method276.getTree());
+
+					}
+					break;
+				case 37 :
+					// smaliParser.g:838:5: insn_format3rc_method_odex
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format3rc_method_odex_in_instruction3956);
+					insn_format3rc_method_odex277=insn_format3rc_method_odex();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format3rc_method_odex277.getTree());
+
+					}
+					break;
+				case 38 :
+					// smaliParser.g:839:5: insn_format3rc_type
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format3rc_type_in_instruction3962);
+					insn_format3rc_type278=insn_format3rc_type();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format3rc_type278.getTree());
+
+					}
+					break;
+				case 39 :
+					// smaliParser.g:840:5: insn_format3rmi_method
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format3rmi_method_in_instruction3968);
+					insn_format3rmi_method279=insn_format3rmi_method();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format3rmi_method279.getTree());
+
+					}
+					break;
+				case 40 :
+					// smaliParser.g:841:5: insn_format3rms_method
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format3rms_method_in_instruction3974);
+					insn_format3rms_method280=insn_format3rms_method();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format3rms_method280.getTree());
+
+					}
+					break;
+				case 41 :
+					// smaliParser.g:842:5: insn_format45cc_method
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format45cc_method_in_instruction3980);
+					insn_format45cc_method281=insn_format45cc_method();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format45cc_method281.getTree());
+
+					}
+					break;
+				case 42 :
+					// smaliParser.g:843:5: insn_format4rcc_method
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format4rcc_method_in_instruction3986);
+					insn_format4rcc_method282=insn_format4rcc_method();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format4rcc_method282.getTree());
+
+					}
+					break;
+				case 43 :
+					// smaliParser.g:844:5: insn_format51l
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_format51l_in_instruction3992);
+					insn_format51l283=insn_format51l();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_format51l283.getTree());
+
+					}
+					break;
+				case 44 :
+					// smaliParser.g:845:5: insn_array_data_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_array_data_directive_in_instruction3998);
+					insn_array_data_directive284=insn_array_data_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_array_data_directive284.getTree());
+
+					}
+					break;
+				case 45 :
+					// smaliParser.g:846:5: insn_packed_switch_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_packed_switch_directive_in_instruction4004);
+					insn_packed_switch_directive285=insn_packed_switch_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_packed_switch_directive285.getTree());
+
+					}
+					break;
+				case 46 :
+					// smaliParser.g:847:5: insn_sparse_switch_directive
+					{
+					root_0 = (CommonTree)adaptor.nil();
+
+
+					pushFollow(FOLLOW_insn_sparse_switch_directive_in_instruction4010);
+					insn_sparse_switch_directive286=insn_sparse_switch_directive();
+					state._fsp--;
+
+					adaptor.addChild(root_0, insn_sparse_switch_directive286.getTree());
+
+					}
+					break;
+
+			}
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "instruction"
+
+
+	public static class insn_format10t_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format10t"
+	// smaliParser.g:849:1: insn_format10t : INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) ;
+	public final smaliParser.insn_format10t_return insn_format10t() throws RecognitionException {
+		smaliParser.insn_format10t_return retval = new smaliParser.insn_format10t_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT10t287=null;
+		ParserRuleReturnScope label_ref288 =null;
+
+		CommonTree INSTRUCTION_FORMAT10t287_tree=null;
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT10t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT10t");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+
+		try {
+			// smaliParser.g:850:3: ( INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) )
+			// smaliParser.g:852:5: INSTRUCTION_FORMAT10t label_ref
+			{
+			INSTRUCTION_FORMAT10t287=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t4030);  
+			stream_INSTRUCTION_FORMAT10t.add(INSTRUCTION_FORMAT10t287);
+
+			pushFollow(FOLLOW_label_ref_in_insn_format10t4032);
+			label_ref288=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(label_ref288.getTree());
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT10t, label_ref
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 853:5: -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref )
+			{
+				// smaliParser.g:853:8: ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT10t, (retval.start), "I_STATEMENT_FORMAT10t"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT10t.nextNode());
+				adaptor.addChild(root_1, stream_label_ref.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format10t"
+
+
+	public static class insn_format10x_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format10x"
+	// smaliParser.g:855:1: insn_format10x : INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) ;
+	public final smaliParser.insn_format10x_return insn_format10x() throws RecognitionException {
+		smaliParser.insn_format10x_return retval = new smaliParser.insn_format10x_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT10x289=null;
+
+		CommonTree INSTRUCTION_FORMAT10x289_tree=null;
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT10x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT10x");
+
+		try {
+			// smaliParser.g:856:3: ( INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) )
+			// smaliParser.g:857:5: INSTRUCTION_FORMAT10x
+			{
+			INSTRUCTION_FORMAT10x289=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x4062);  
+			stream_INSTRUCTION_FORMAT10x.add(INSTRUCTION_FORMAT10x289);
+
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT10x
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 858:5: -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x )
+			{
+				// smaliParser.g:858:8: ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT10x, (retval.start), "I_STATEMENT_FORMAT10x"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT10x.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format10x"
+
+
+	public static class insn_format10x_odex_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format10x_odex"
+	// smaliParser.g:860:1: insn_format10x_odex : INSTRUCTION_FORMAT10x_ODEX ;
+	public final smaliParser.insn_format10x_odex_return insn_format10x_odex() throws RecognitionException {
+		smaliParser.insn_format10x_odex_return retval = new smaliParser.insn_format10x_odex_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT10x_ODEX290=null;
+
+		CommonTree INSTRUCTION_FORMAT10x_ODEX290_tree=null;
+
+		try {
+			// smaliParser.g:861:3: ( INSTRUCTION_FORMAT10x_ODEX )
+			// smaliParser.g:862:5: INSTRUCTION_FORMAT10x_ODEX
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			INSTRUCTION_FORMAT10x_ODEX290=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_insn_format10x_odex4090); 
+			INSTRUCTION_FORMAT10x_ODEX290_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT10x_ODEX290);
+			adaptor.addChild(root_0, INSTRUCTION_FORMAT10x_ODEX290_tree);
+
+
+			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT10x_ODEX290!=null?INSTRUCTION_FORMAT10x_ODEX290.getText():null));
+			    
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format10x_odex"
+
+
+	public static class insn_format11n_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format11n"
+	// smaliParser.g:867:1: insn_format11n : INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) ;
+	public final smaliParser.insn_format11n_return insn_format11n() throws RecognitionException {
+		smaliParser.insn_format11n_return retval = new smaliParser.insn_format11n_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT11n291=null;
+		Token REGISTER292=null;
+		Token COMMA293=null;
+		ParserRuleReturnScope integral_literal294 =null;
+
+		CommonTree INSTRUCTION_FORMAT11n291_tree=null;
+		CommonTree REGISTER292_tree=null;
+		CommonTree COMMA293_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT11n=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT11n");
+		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
+
+		try {
+			// smaliParser.g:868:3: ( INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) )
+			// smaliParser.g:869:5: INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal
+			{
+			INSTRUCTION_FORMAT11n291=(Token)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n4111);  
+			stream_INSTRUCTION_FORMAT11n.add(INSTRUCTION_FORMAT11n291);
+
+			REGISTER292=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n4113);  
+			stream_REGISTER.add(REGISTER292);
+
+			COMMA293=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format11n4115);  
+			stream_COMMA.add(COMMA293);
+
+			pushFollow(FOLLOW_integral_literal_in_insn_format11n4117);
+			integral_literal294=integral_literal();
+			state._fsp--;
+
+			stream_integral_literal.add(integral_literal294.getTree());
+			// AST REWRITE
+			// elements: integral_literal, INSTRUCTION_FORMAT11n, REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 870:5: -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal )
+			{
+				// smaliParser.g:870:8: ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT11n, (retval.start), "I_STATEMENT_FORMAT11n"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT11n.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_integral_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format11n"
+
+
+	public static class insn_format11x_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format11x"
+	// smaliParser.g:872:1: insn_format11x : INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) ;
+	public final smaliParser.insn_format11x_return insn_format11x() throws RecognitionException {
+		smaliParser.insn_format11x_return retval = new smaliParser.insn_format11x_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT11x295=null;
+		Token REGISTER296=null;
+
+		CommonTree INSTRUCTION_FORMAT11x295_tree=null;
+		CommonTree REGISTER296_tree=null;
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT11x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT11x");
+
+		try {
+			// smaliParser.g:873:3: ( INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) )
+			// smaliParser.g:874:5: INSTRUCTION_FORMAT11x REGISTER
+			{
+			INSTRUCTION_FORMAT11x295=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x4149);  
+			stream_INSTRUCTION_FORMAT11x.add(INSTRUCTION_FORMAT11x295);
+
+			REGISTER296=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x4151);  
+			stream_REGISTER.add(REGISTER296);
+
+			// AST REWRITE
+			// elements: REGISTER, INSTRUCTION_FORMAT11x
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 875:5: -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER )
+			{
+				// smaliParser.g:875:8: ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT11x, (retval.start), "I_STATEMENT_FORMAT11x"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT11x.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format11x"
+
+
+	public static class insn_format12x_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format12x"
+	// smaliParser.g:877:1: insn_format12x : instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) ;
+	public final smaliParser.insn_format12x_return insn_format12x() throws RecognitionException {
+		smaliParser.insn_format12x_return retval = new smaliParser.insn_format12x_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token REGISTER298=null;
+		Token COMMA299=null;
+		Token REGISTER300=null;
+		ParserRuleReturnScope instruction_format12x297 =null;
+
+		CommonTree REGISTER298_tree=null;
+		CommonTree COMMA299_tree=null;
+		CommonTree REGISTER300_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleSubtreeStream stream_instruction_format12x=new RewriteRuleSubtreeStream(adaptor,"rule instruction_format12x");
+
+		try {
+			// smaliParser.g:878:3: ( instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) )
+			// smaliParser.g:879:5: instruction_format12x REGISTER COMMA REGISTER
+			{
+			pushFollow(FOLLOW_instruction_format12x_in_insn_format12x4181);
+			instruction_format12x297=instruction_format12x();
+			state._fsp--;
+
+			stream_instruction_format12x.add(instruction_format12x297.getTree());
+			REGISTER298=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4183);  
+			stream_REGISTER.add(REGISTER298);
+
+			COMMA299=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format12x4185);  
+			stream_COMMA.add(COMMA299);
+
+			REGISTER300=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4187);  
+			stream_REGISTER.add(REGISTER300);
+
+			// AST REWRITE
+			// elements: REGISTER, instruction_format12x, REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 880:5: -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER )
+			{
+				// smaliParser.g:880:8: ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT12x, (retval.start), "I_STATEMENT_FORMAT12x"), root_1);
+				adaptor.addChild(root_1, stream_instruction_format12x.nextTree());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format12x"
+
+
+	public static class insn_format20bc_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format20bc"
+	// smaliParser.g:882:1: insn_format20bc : INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) ;
+	public final smaliParser.insn_format20bc_return insn_format20bc() throws RecognitionException {
+		smaliParser.insn_format20bc_return retval = new smaliParser.insn_format20bc_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT20bc301=null;
+		Token VERIFICATION_ERROR_TYPE302=null;
+		Token COMMA303=null;
+		ParserRuleReturnScope verification_error_reference304 =null;
+
+		CommonTree INSTRUCTION_FORMAT20bc301_tree=null;
+		CommonTree VERIFICATION_ERROR_TYPE302_tree=null;
+		CommonTree COMMA303_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_VERIFICATION_ERROR_TYPE=new RewriteRuleTokenStream(adaptor,"token VERIFICATION_ERROR_TYPE");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT20bc=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT20bc");
+		RewriteRuleSubtreeStream stream_verification_error_reference=new RewriteRuleSubtreeStream(adaptor,"rule verification_error_reference");
+
+		try {
+			// smaliParser.g:883:3: ( INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) )
+			// smaliParser.g:884:5: INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference
+			{
+			INSTRUCTION_FORMAT20bc301=(Token)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc4219);  
+			stream_INSTRUCTION_FORMAT20bc.add(INSTRUCTION_FORMAT20bc301);
+
+			VERIFICATION_ERROR_TYPE302=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_insn_format20bc4221);  
+			stream_VERIFICATION_ERROR_TYPE.add(VERIFICATION_ERROR_TYPE302);
+
+			COMMA303=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format20bc4223);  
+			stream_COMMA.add(COMMA303);
+
+			pushFollow(FOLLOW_verification_error_reference_in_insn_format20bc4225);
+			verification_error_reference304=verification_error_reference();
+			state._fsp--;
+
+			stream_verification_error_reference.add(verification_error_reference304.getTree());
+
+			      if (!allowOdex || opcodes.getOpcodeByName((INSTRUCTION_FORMAT20bc301!=null?INSTRUCTION_FORMAT20bc301.getText():null)) == null || apiLevel >= 14) {
+			        throwOdexedInstructionException(input, (INSTRUCTION_FORMAT20bc301!=null?INSTRUCTION_FORMAT20bc301.getText():null));
+			      }
+			    
+			// AST REWRITE
+			// elements: VERIFICATION_ERROR_TYPE, verification_error_reference, INSTRUCTION_FORMAT20bc
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 890:5: -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference )
+			{
+				// smaliParser.g:890:8: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT20bc, "I_STATEMENT_FORMAT20bc"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT20bc.nextNode());
+				adaptor.addChild(root_1, stream_VERIFICATION_ERROR_TYPE.nextNode());
+				adaptor.addChild(root_1, stream_verification_error_reference.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format20bc"
+
+
+	public static class insn_format20t_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format20t"
+	// smaliParser.g:892:1: insn_format20t : INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) ;
+	public final smaliParser.insn_format20t_return insn_format20t() throws RecognitionException {
+		smaliParser.insn_format20t_return retval = new smaliParser.insn_format20t_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT20t305=null;
+		ParserRuleReturnScope label_ref306 =null;
+
+		CommonTree INSTRUCTION_FORMAT20t305_tree=null;
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT20t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT20t");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+
+		try {
+			// smaliParser.g:893:3: ( INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) )
+			// smaliParser.g:894:5: INSTRUCTION_FORMAT20t label_ref
+			{
+			INSTRUCTION_FORMAT20t305=(Token)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t4262);  
+			stream_INSTRUCTION_FORMAT20t.add(INSTRUCTION_FORMAT20t305);
+
+			pushFollow(FOLLOW_label_ref_in_insn_format20t4264);
+			label_ref306=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(label_ref306.getTree());
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT20t, label_ref
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 895:5: -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref )
+			{
+				// smaliParser.g:895:8: ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT20t, (retval.start), "I_STATEMENT_FORMAT20t"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT20t.nextNode());
+				adaptor.addChild(root_1, stream_label_ref.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format20t"
+
+
+	public static class insn_format21c_field_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format21c_field"
+	// smaliParser.g:897:1: insn_format21c_field : INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) ;
+	public final smaliParser.insn_format21c_field_return insn_format21c_field() throws RecognitionException {
+		smaliParser.insn_format21c_field_return retval = new smaliParser.insn_format21c_field_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT21c_FIELD307=null;
+		Token REGISTER308=null;
+		Token COMMA309=null;
+		ParserRuleReturnScope field_reference310 =null;
+
+		CommonTree INSTRUCTION_FORMAT21c_FIELD307_tree=null;
+		CommonTree REGISTER308_tree=null;
+		CommonTree COMMA309_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_FIELD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_FIELD");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
+
+		try {
+			// smaliParser.g:898:3: ( INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) )
+			// smaliParser.g:899:5: INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference
+			{
+			INSTRUCTION_FORMAT21c_FIELD307=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_insn_format21c_field4294);  
+			stream_INSTRUCTION_FORMAT21c_FIELD.add(INSTRUCTION_FORMAT21c_FIELD307);
+
+			REGISTER308=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field4296);  
+			stream_REGISTER.add(REGISTER308);
+
+			COMMA309=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field4298);  
+			stream_COMMA.add(COMMA309);
+
+			pushFollow(FOLLOW_field_reference_in_insn_format21c_field4300);
+			field_reference310=field_reference();
+			state._fsp--;
+
+			stream_field_reference.add(field_reference310.getTree());
+			// AST REWRITE
+			// elements: REGISTER, INSTRUCTION_FORMAT21c_FIELD, field_reference
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 900:5: -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference )
+			{
+				// smaliParser.g:900:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_FIELD, (retval.start), "I_STATEMENT_FORMAT21c_FIELD"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT21c_FIELD.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_field_reference.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format21c_field"
+
+
+	public static class insn_format21c_field_odex_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format21c_field_odex"
+	// smaliParser.g:902:1: insn_format21c_field_odex : INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) ;
+	public final smaliParser.insn_format21c_field_odex_return insn_format21c_field_odex() throws RecognitionException {
+		smaliParser.insn_format21c_field_odex_return retval = new smaliParser.insn_format21c_field_odex_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT21c_FIELD_ODEX311=null;
+		Token REGISTER312=null;
+		Token COMMA313=null;
+		ParserRuleReturnScope field_reference314 =null;
+
+		CommonTree INSTRUCTION_FORMAT21c_FIELD_ODEX311_tree=null;
+		CommonTree REGISTER312_tree=null;
+		CommonTree COMMA313_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_FIELD_ODEX=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_FIELD_ODEX");
+		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
+
+		try {
+			// smaliParser.g:903:3: ( INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) )
+			// smaliParser.g:904:5: INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference
+			{
+			INSTRUCTION_FORMAT21c_FIELD_ODEX311=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_insn_format21c_field_odex4332);  
+			stream_INSTRUCTION_FORMAT21c_FIELD_ODEX.add(INSTRUCTION_FORMAT21c_FIELD_ODEX311);
+
+			REGISTER312=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field_odex4334);  
+			stream_REGISTER.add(REGISTER312);
+
+			COMMA313=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field_odex4336);  
+			stream_COMMA.add(COMMA313);
+
+			pushFollow(FOLLOW_field_reference_in_insn_format21c_field_odex4338);
+			field_reference314=field_reference();
+			state._fsp--;
+
+			stream_field_reference.add(field_reference314.getTree());
+
+			      if (!allowOdex || opcodes.getOpcodeByName((INSTRUCTION_FORMAT21c_FIELD_ODEX311!=null?INSTRUCTION_FORMAT21c_FIELD_ODEX311.getText():null)) == null || apiLevel >= 14) {
+			        throwOdexedInstructionException(input, (INSTRUCTION_FORMAT21c_FIELD_ODEX311!=null?INSTRUCTION_FORMAT21c_FIELD_ODEX311.getText():null));
+			      }
+			    
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT21c_FIELD_ODEX, REGISTER, field_reference
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 910:5: -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference )
+			{
+				// smaliParser.g:910:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_FIELD, (retval.start), "I_STATEMENT_FORMAT21c_FIELD"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT21c_FIELD_ODEX.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_field_reference.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format21c_field_odex"
+
+
+	public static class insn_format21c_string_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format21c_string"
+	// smaliParser.g:912:1: insn_format21c_string : INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) ;
+	public final smaliParser.insn_format21c_string_return insn_format21c_string() throws RecognitionException {
+		smaliParser.insn_format21c_string_return retval = new smaliParser.insn_format21c_string_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT21c_STRING315=null;
+		Token REGISTER316=null;
+		Token COMMA317=null;
+		Token STRING_LITERAL318=null;
+
+		CommonTree INSTRUCTION_FORMAT21c_STRING315_tree=null;
+		CommonTree REGISTER316_tree=null;
+		CommonTree COMMA317_tree=null;
+		CommonTree STRING_LITERAL318_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_STRING=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_STRING");
+
+		try {
+			// smaliParser.g:913:3: ( INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) )
+			// smaliParser.g:914:5: INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL
+			{
+			INSTRUCTION_FORMAT21c_STRING315=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string4376);  
+			stream_INSTRUCTION_FORMAT21c_STRING.add(INSTRUCTION_FORMAT21c_STRING315);
+
+			REGISTER316=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string4378);  
+			stream_REGISTER.add(REGISTER316);
+
+			COMMA317=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_string4380);  
+			stream_COMMA.add(COMMA317);
+
+			STRING_LITERAL318=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format21c_string4382);  
+			stream_STRING_LITERAL.add(STRING_LITERAL318);
+
+			// AST REWRITE
+			// elements: STRING_LITERAL, REGISTER, INSTRUCTION_FORMAT21c_STRING
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 915:5: -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL )
+			{
+				// smaliParser.g:915:8: ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_STRING, (retval.start), "I_STATEMENT_FORMAT21c_STRING"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT21c_STRING.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format21c_string"
+
+
+	public static class insn_format21c_type_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format21c_type"
+	// smaliParser.g:917:1: insn_format21c_type : INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ;
+	public final smaliParser.insn_format21c_type_return insn_format21c_type() throws RecognitionException {
+		smaliParser.insn_format21c_type_return retval = new smaliParser.insn_format21c_type_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT21c_TYPE319=null;
+		Token REGISTER320=null;
+		Token COMMA321=null;
+		ParserRuleReturnScope nonvoid_type_descriptor322 =null;
+
+		CommonTree INSTRUCTION_FORMAT21c_TYPE319_tree=null;
+		CommonTree REGISTER320_tree=null;
+		CommonTree COMMA321_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_TYPE=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_TYPE");
+		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
+
+		try {
+			// smaliParser.g:918:3: ( INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) )
+			// smaliParser.g:919:5: INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor
+			{
+			INSTRUCTION_FORMAT21c_TYPE319=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type4414);  
+			stream_INSTRUCTION_FORMAT21c_TYPE.add(INSTRUCTION_FORMAT21c_TYPE319);
+
+			REGISTER320=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type4416);  
+			stream_REGISTER.add(REGISTER320);
+
+			COMMA321=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_type4418);  
+			stream_COMMA.add(COMMA321);
+
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format21c_type4420);
+			nonvoid_type_descriptor322=nonvoid_type_descriptor();
+			state._fsp--;
+
+			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor322.getTree());
+			// AST REWRITE
+			// elements: REGISTER, INSTRUCTION_FORMAT21c_TYPE, nonvoid_type_descriptor
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 920:5: -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor )
+			{
+				// smaliParser.g:920:8: ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_TYPE, (retval.start), "I_STATEMENT_FORMAT21c"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT21c_TYPE.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_nonvoid_type_descriptor.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format21c_type"
+
+
+	public static class insn_format21ih_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format21ih"
+	// smaliParser.g:922:1: insn_format21ih : INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ;
+	public final smaliParser.insn_format21ih_return insn_format21ih() throws RecognitionException {
+		smaliParser.insn_format21ih_return retval = new smaliParser.insn_format21ih_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT21ih323=null;
+		Token REGISTER324=null;
+		Token COMMA325=null;
+		ParserRuleReturnScope fixed_32bit_literal326 =null;
+
+		CommonTree INSTRUCTION_FORMAT21ih323_tree=null;
+		CommonTree REGISTER324_tree=null;
+		CommonTree COMMA325_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21ih=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21ih");
+		RewriteRuleSubtreeStream stream_fixed_32bit_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_32bit_literal");
+
+		try {
+			// smaliParser.g:923:3: ( INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) )
+			// smaliParser.g:924:5: INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal
+			{
+			INSTRUCTION_FORMAT21ih323=(Token)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih4452);  
+			stream_INSTRUCTION_FORMAT21ih.add(INSTRUCTION_FORMAT21ih323);
+
+			REGISTER324=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih4454);  
+			stream_REGISTER.add(REGISTER324);
+
+			COMMA325=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21ih4456);  
+			stream_COMMA.add(COMMA325);
+
+			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format21ih4458);
+			fixed_32bit_literal326=fixed_32bit_literal();
+			state._fsp--;
+
+			stream_fixed_32bit_literal.add(fixed_32bit_literal326.getTree());
+			// AST REWRITE
+			// elements: REGISTER, INSTRUCTION_FORMAT21ih, fixed_32bit_literal
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 925:5: -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal )
+			{
+				// smaliParser.g:925:8: ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21ih, (retval.start), "I_STATEMENT_FORMAT21ih"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT21ih.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_fixed_32bit_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format21ih"
+
+
+	public static class insn_format21lh_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format21lh"
+	// smaliParser.g:927:1: insn_format21lh : INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) ;
+	public final smaliParser.insn_format21lh_return insn_format21lh() throws RecognitionException {
+		smaliParser.insn_format21lh_return retval = new smaliParser.insn_format21lh_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT21lh327=null;
+		Token REGISTER328=null;
+		Token COMMA329=null;
+		ParserRuleReturnScope fixed_32bit_literal330 =null;
+
+		CommonTree INSTRUCTION_FORMAT21lh327_tree=null;
+		CommonTree REGISTER328_tree=null;
+		CommonTree COMMA329_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21lh=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21lh");
+		RewriteRuleSubtreeStream stream_fixed_32bit_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_32bit_literal");
+
+		try {
+			// smaliParser.g:928:3: ( INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) )
+			// smaliParser.g:929:5: INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal
+			{
+			INSTRUCTION_FORMAT21lh327=(Token)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh4490);  
+			stream_INSTRUCTION_FORMAT21lh.add(INSTRUCTION_FORMAT21lh327);
+
+			REGISTER328=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh4492);  
+			stream_REGISTER.add(REGISTER328);
+
+			COMMA329=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21lh4494);  
+			stream_COMMA.add(COMMA329);
+
+			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format21lh4496);
+			fixed_32bit_literal330=fixed_32bit_literal();
+			state._fsp--;
+
+			stream_fixed_32bit_literal.add(fixed_32bit_literal330.getTree());
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT21lh, fixed_32bit_literal, REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 930:5: -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal )
+			{
+				// smaliParser.g:930:8: ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21lh, (retval.start), "I_STATEMENT_FORMAT21lh"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT21lh.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_fixed_32bit_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format21lh"
+
+
+	public static class insn_format21s_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format21s"
+	// smaliParser.g:932:1: insn_format21s : INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) ;
+	public final smaliParser.insn_format21s_return insn_format21s() throws RecognitionException {
+		smaliParser.insn_format21s_return retval = new smaliParser.insn_format21s_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT21s331=null;
+		Token REGISTER332=null;
+		Token COMMA333=null;
+		ParserRuleReturnScope integral_literal334 =null;
+
+		CommonTree INSTRUCTION_FORMAT21s331_tree=null;
+		CommonTree REGISTER332_tree=null;
+		CommonTree COMMA333_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21s=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21s");
+		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
+
+		try {
+			// smaliParser.g:933:3: ( INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) )
+			// smaliParser.g:934:5: INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal
+			{
+			INSTRUCTION_FORMAT21s331=(Token)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s4528);  
+			stream_INSTRUCTION_FORMAT21s.add(INSTRUCTION_FORMAT21s331);
+
+			REGISTER332=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s4530);  
+			stream_REGISTER.add(REGISTER332);
+
+			COMMA333=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21s4532);  
+			stream_COMMA.add(COMMA333);
+
+			pushFollow(FOLLOW_integral_literal_in_insn_format21s4534);
+			integral_literal334=integral_literal();
+			state._fsp--;
+
+			stream_integral_literal.add(integral_literal334.getTree());
+			// AST REWRITE
+			// elements: integral_literal, REGISTER, INSTRUCTION_FORMAT21s
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 935:5: -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal )
+			{
+				// smaliParser.g:935:8: ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21s, (retval.start), "I_STATEMENT_FORMAT21s"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT21s.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_integral_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format21s"
+
+
+	public static class insn_format21t_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format21t"
+	// smaliParser.g:937:1: insn_format21t : INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) ;
+	public final smaliParser.insn_format21t_return insn_format21t() throws RecognitionException {
+		smaliParser.insn_format21t_return retval = new smaliParser.insn_format21t_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT21t335=null;
+		Token REGISTER336=null;
+		Token COMMA337=null;
+		ParserRuleReturnScope label_ref338 =null;
+
+		CommonTree INSTRUCTION_FORMAT21t335_tree=null;
+		CommonTree REGISTER336_tree=null;
+		CommonTree COMMA337_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21t");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+
+		try {
+			// smaliParser.g:938:3: ( INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) )
+			// smaliParser.g:939:5: INSTRUCTION_FORMAT21t REGISTER COMMA label_ref
+			{
+			INSTRUCTION_FORMAT21t335=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t4566);  
+			stream_INSTRUCTION_FORMAT21t.add(INSTRUCTION_FORMAT21t335);
+
+			REGISTER336=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t4568);  
+			stream_REGISTER.add(REGISTER336);
+
+			COMMA337=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21t4570);  
+			stream_COMMA.add(COMMA337);
+
+			pushFollow(FOLLOW_label_ref_in_insn_format21t4572);
+			label_ref338=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(label_ref338.getTree());
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT21t, label_ref, REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 940:5: -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref )
+			{
+				// smaliParser.g:940:8: ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21t, (retval.start), "I_STATEMENT_FORMAT21t"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT21t.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_label_ref.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format21t"
+
+
+	public static class insn_format22b_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format22b"
+	// smaliParser.g:942:1: insn_format22b : INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) ;
+	public final smaliParser.insn_format22b_return insn_format22b() throws RecognitionException {
+		smaliParser.insn_format22b_return retval = new smaliParser.insn_format22b_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT22b339=null;
+		Token REGISTER340=null;
+		Token COMMA341=null;
+		Token REGISTER342=null;
+		Token COMMA343=null;
+		ParserRuleReturnScope integral_literal344 =null;
+
+		CommonTree INSTRUCTION_FORMAT22b339_tree=null;
+		CommonTree REGISTER340_tree=null;
+		CommonTree COMMA341_tree=null;
+		CommonTree REGISTER342_tree=null;
+		CommonTree COMMA343_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22b=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22b");
+		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
+
+		try {
+			// smaliParser.g:943:3: ( INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) )
+			// smaliParser.g:944:5: INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal
+			{
+			INSTRUCTION_FORMAT22b339=(Token)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b4604);  
+			stream_INSTRUCTION_FORMAT22b.add(INSTRUCTION_FORMAT22b339);
+
+			REGISTER340=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4606);  
+			stream_REGISTER.add(REGISTER340);
+
+			COMMA341=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4608);  
+			stream_COMMA.add(COMMA341);
+
+			REGISTER342=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4610);  
+			stream_REGISTER.add(REGISTER342);
+
+			COMMA343=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4612);  
+			stream_COMMA.add(COMMA343);
+
+			pushFollow(FOLLOW_integral_literal_in_insn_format22b4614);
+			integral_literal344=integral_literal();
+			state._fsp--;
+
+			stream_integral_literal.add(integral_literal344.getTree());
+			// AST REWRITE
+			// elements: REGISTER, REGISTER, integral_literal, INSTRUCTION_FORMAT22b
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 945:5: -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal )
+			{
+				// smaliParser.g:945:8: ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22b, (retval.start), "I_STATEMENT_FORMAT22b"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT22b.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_integral_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format22b"
+
+
+	public static class insn_format22c_field_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format22c_field"
+	// smaliParser.g:947:1: insn_format22c_field : INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) ;
+	public final smaliParser.insn_format22c_field_return insn_format22c_field() throws RecognitionException {
+		smaliParser.insn_format22c_field_return retval = new smaliParser.insn_format22c_field_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT22c_FIELD345=null;
+		Token REGISTER346=null;
+		Token COMMA347=null;
+		Token REGISTER348=null;
+		Token COMMA349=null;
+		ParserRuleReturnScope field_reference350 =null;
+
+		CommonTree INSTRUCTION_FORMAT22c_FIELD345_tree=null;
+		CommonTree REGISTER346_tree=null;
+		CommonTree COMMA347_tree=null;
+		CommonTree REGISTER348_tree=null;
+		CommonTree COMMA349_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22c_FIELD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22c_FIELD");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
+
+		try {
+			// smaliParser.g:948:3: ( INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) )
+			// smaliParser.g:949:5: INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference
+			{
+			INSTRUCTION_FORMAT22c_FIELD345=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_insn_format22c_field4648);  
+			stream_INSTRUCTION_FORMAT22c_FIELD.add(INSTRUCTION_FORMAT22c_FIELD345);
+
+			REGISTER346=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4650);  
+			stream_REGISTER.add(REGISTER346);
+
+			COMMA347=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4652);  
+			stream_COMMA.add(COMMA347);
+
+			REGISTER348=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4654);  
+			stream_REGISTER.add(REGISTER348);
+
+			COMMA349=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4656);  
+			stream_COMMA.add(COMMA349);
+
+			pushFollow(FOLLOW_field_reference_in_insn_format22c_field4658);
+			field_reference350=field_reference();
+			state._fsp--;
+
+			stream_field_reference.add(field_reference350.getTree());
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT22c_FIELD, REGISTER, field_reference, REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 950:5: -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference )
+			{
+				// smaliParser.g:950:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22c_FIELD, (retval.start), "I_STATEMENT_FORMAT22c_FIELD"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT22c_FIELD.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_field_reference.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format22c_field"
+
+
+	public static class insn_format22c_field_odex_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format22c_field_odex"
+	// smaliParser.g:952:1: insn_format22c_field_odex : INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) ;
+	public final smaliParser.insn_format22c_field_odex_return insn_format22c_field_odex() throws RecognitionException {
+		smaliParser.insn_format22c_field_odex_return retval = new smaliParser.insn_format22c_field_odex_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT22c_FIELD_ODEX351=null;
+		Token REGISTER352=null;
+		Token COMMA353=null;
+		Token REGISTER354=null;
+		Token COMMA355=null;
+		ParserRuleReturnScope field_reference356 =null;
+
+		CommonTree INSTRUCTION_FORMAT22c_FIELD_ODEX351_tree=null;
+		CommonTree REGISTER352_tree=null;
+		CommonTree COMMA353_tree=null;
+		CommonTree REGISTER354_tree=null;
+		CommonTree COMMA355_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22c_FIELD_ODEX=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22c_FIELD_ODEX");
+		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
+
+		try {
+			// smaliParser.g:953:3: ( INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) )
+			// smaliParser.g:954:5: INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference
+			{
+			INSTRUCTION_FORMAT22c_FIELD_ODEX351=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_insn_format22c_field_odex4692);  
+			stream_INSTRUCTION_FORMAT22c_FIELD_ODEX.add(INSTRUCTION_FORMAT22c_FIELD_ODEX351);
+
+			REGISTER352=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4694);  
+			stream_REGISTER.add(REGISTER352);
+
+			COMMA353=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4696);  
+			stream_COMMA.add(COMMA353);
+
+			REGISTER354=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4698);  
+			stream_REGISTER.add(REGISTER354);
+
+			COMMA355=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4700);  
+			stream_COMMA.add(COMMA355);
+
+			pushFollow(FOLLOW_field_reference_in_insn_format22c_field_odex4702);
+			field_reference356=field_reference();
+			state._fsp--;
+
+			stream_field_reference.add(field_reference356.getTree());
+
+			      if (!allowOdex || opcodes.getOpcodeByName((INSTRUCTION_FORMAT22c_FIELD_ODEX351!=null?INSTRUCTION_FORMAT22c_FIELD_ODEX351.getText():null)) == null || apiLevel >= 14) {
+			        throwOdexedInstructionException(input, (INSTRUCTION_FORMAT22c_FIELD_ODEX351!=null?INSTRUCTION_FORMAT22c_FIELD_ODEX351.getText():null));
+			      }
+			    
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT22c_FIELD_ODEX, field_reference, REGISTER, REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 960:5: -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference )
+			{
+				// smaliParser.g:960:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22c_FIELD, (retval.start), "I_STATEMENT_FORMAT22c_FIELD"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT22c_FIELD_ODEX.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_field_reference.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format22c_field_odex"
+
+
+	public static class insn_format22c_type_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format22c_type"
+	// smaliParser.g:962:1: insn_format22c_type : INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) ;
+	public final smaliParser.insn_format22c_type_return insn_format22c_type() throws RecognitionException {
+		smaliParser.insn_format22c_type_return retval = new smaliParser.insn_format22c_type_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT22c_TYPE357=null;
+		Token REGISTER358=null;
+		Token COMMA359=null;
+		Token REGISTER360=null;
+		Token COMMA361=null;
+		ParserRuleReturnScope nonvoid_type_descriptor362 =null;
+
+		CommonTree INSTRUCTION_FORMAT22c_TYPE357_tree=null;
+		CommonTree REGISTER358_tree=null;
+		CommonTree COMMA359_tree=null;
+		CommonTree REGISTER360_tree=null;
+		CommonTree COMMA361_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22c_TYPE=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22c_TYPE");
+		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
+
+		try {
+			// smaliParser.g:963:3: ( INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) )
+			// smaliParser.g:964:5: INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor
+			{
+			INSTRUCTION_FORMAT22c_TYPE357=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type4742);  
+			stream_INSTRUCTION_FORMAT22c_TYPE.add(INSTRUCTION_FORMAT22c_TYPE357);
+
+			REGISTER358=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4744);  
+			stream_REGISTER.add(REGISTER358);
+
+			COMMA359=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4746);  
+			stream_COMMA.add(COMMA359);
+
+			REGISTER360=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4748);  
+			stream_REGISTER.add(REGISTER360);
+
+			COMMA361=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4750);  
+			stream_COMMA.add(COMMA361);
+
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format22c_type4752);
+			nonvoid_type_descriptor362=nonvoid_type_descriptor();
+			state._fsp--;
+
+			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor362.getTree());
+			// AST REWRITE
+			// elements: REGISTER, REGISTER, nonvoid_type_descriptor, INSTRUCTION_FORMAT22c_TYPE
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 965:5: -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor )
+			{
+				// smaliParser.g:965:8: ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22c_TYPE, (retval.start), "I_STATEMENT_FORMAT22c_TYPE"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT22c_TYPE.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_nonvoid_type_descriptor.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format22c_type"
+
+
+	public static class insn_format22cs_field_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format22cs_field"
+	// smaliParser.g:967:1: insn_format22cs_field : INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET ;
+	public final smaliParser.insn_format22cs_field_return insn_format22cs_field() throws RecognitionException {
+		smaliParser.insn_format22cs_field_return retval = new smaliParser.insn_format22cs_field_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT22cs_FIELD363=null;
+		Token REGISTER364=null;
+		Token COMMA365=null;
+		Token REGISTER366=null;
+		Token COMMA367=null;
+		Token FIELD_OFFSET368=null;
+
+		CommonTree INSTRUCTION_FORMAT22cs_FIELD363_tree=null;
+		CommonTree REGISTER364_tree=null;
+		CommonTree COMMA365_tree=null;
+		CommonTree REGISTER366_tree=null;
+		CommonTree COMMA367_tree=null;
+		CommonTree FIELD_OFFSET368_tree=null;
+
+		try {
+			// smaliParser.g:968:3: ( INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET )
+			// smaliParser.g:969:5: INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			INSTRUCTION_FORMAT22cs_FIELD363=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_insn_format22cs_field4786); 
+			INSTRUCTION_FORMAT22cs_FIELD363_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT22cs_FIELD363);
+			adaptor.addChild(root_0, INSTRUCTION_FORMAT22cs_FIELD363_tree);
+
+			REGISTER364=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4788); 
+			REGISTER364_tree = (CommonTree)adaptor.create(REGISTER364);
+			adaptor.addChild(root_0, REGISTER364_tree);
+
+			COMMA365=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4790); 
+			COMMA365_tree = (CommonTree)adaptor.create(COMMA365);
+			adaptor.addChild(root_0, COMMA365_tree);
+
+			REGISTER366=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4792); 
+			REGISTER366_tree = (CommonTree)adaptor.create(REGISTER366);
+			adaptor.addChild(root_0, REGISTER366_tree);
+
+			COMMA367=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4794); 
+			COMMA367_tree = (CommonTree)adaptor.create(COMMA367);
+			adaptor.addChild(root_0, COMMA367_tree);
+
+			FIELD_OFFSET368=(Token)match(input,FIELD_OFFSET,FOLLOW_FIELD_OFFSET_in_insn_format22cs_field4796); 
+			FIELD_OFFSET368_tree = (CommonTree)adaptor.create(FIELD_OFFSET368);
+			adaptor.addChild(root_0, FIELD_OFFSET368_tree);
+
+
+			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT22cs_FIELD363!=null?INSTRUCTION_FORMAT22cs_FIELD363.getText():null));
+			    
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format22cs_field"
+
+
+	public static class insn_format22s_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format22s"
+	// smaliParser.g:974:1: insn_format22s : instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) ;
+	public final smaliParser.insn_format22s_return insn_format22s() throws RecognitionException {
+		smaliParser.insn_format22s_return retval = new smaliParser.insn_format22s_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token REGISTER370=null;
+		Token COMMA371=null;
+		Token REGISTER372=null;
+		Token COMMA373=null;
+		ParserRuleReturnScope instruction_format22s369 =null;
+		ParserRuleReturnScope integral_literal374 =null;
+
+		CommonTree REGISTER370_tree=null;
+		CommonTree COMMA371_tree=null;
+		CommonTree REGISTER372_tree=null;
+		CommonTree COMMA373_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleSubtreeStream stream_instruction_format22s=new RewriteRuleSubtreeStream(adaptor,"rule instruction_format22s");
+		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
+
+		try {
+			// smaliParser.g:975:3: ( instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) )
+			// smaliParser.g:976:5: instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal
+			{
+			pushFollow(FOLLOW_instruction_format22s_in_insn_format22s4817);
+			instruction_format22s369=instruction_format22s();
+			state._fsp--;
+
+			stream_instruction_format22s.add(instruction_format22s369.getTree());
+			REGISTER370=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4819);  
+			stream_REGISTER.add(REGISTER370);
+
+			COMMA371=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4821);  
+			stream_COMMA.add(COMMA371);
+
+			REGISTER372=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4823);  
+			stream_REGISTER.add(REGISTER372);
+
+			COMMA373=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4825);  
+			stream_COMMA.add(COMMA373);
+
+			pushFollow(FOLLOW_integral_literal_in_insn_format22s4827);
+			integral_literal374=integral_literal();
+			state._fsp--;
+
+			stream_integral_literal.add(integral_literal374.getTree());
+			// AST REWRITE
+			// elements: REGISTER, REGISTER, instruction_format22s, integral_literal
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 977:5: -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal )
+			{
+				// smaliParser.g:977:8: ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22s, (retval.start), "I_STATEMENT_FORMAT22s"), root_1);
+				adaptor.addChild(root_1, stream_instruction_format22s.nextTree());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_integral_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format22s"
+
+
+	public static class insn_format22t_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format22t"
+	// smaliParser.g:979:1: insn_format22t : INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) ;
+	public final smaliParser.insn_format22t_return insn_format22t() throws RecognitionException {
+		smaliParser.insn_format22t_return retval = new smaliParser.insn_format22t_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT22t375=null;
+		Token REGISTER376=null;
+		Token COMMA377=null;
+		Token REGISTER378=null;
+		Token COMMA379=null;
+		ParserRuleReturnScope label_ref380 =null;
+
+		CommonTree INSTRUCTION_FORMAT22t375_tree=null;
+		CommonTree REGISTER376_tree=null;
+		CommonTree COMMA377_tree=null;
+		CommonTree REGISTER378_tree=null;
+		CommonTree COMMA379_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22t");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+
+		try {
+			// smaliParser.g:980:3: ( INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) )
+			// smaliParser.g:981:5: INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref
+			{
+			INSTRUCTION_FORMAT22t375=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t4861);  
+			stream_INSTRUCTION_FORMAT22t.add(INSTRUCTION_FORMAT22t375);
+
+			REGISTER376=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4863);  
+			stream_REGISTER.add(REGISTER376);
+
+			COMMA377=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4865);  
+			stream_COMMA.add(COMMA377);
+
+			REGISTER378=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4867);  
+			stream_REGISTER.add(REGISTER378);
+
+			COMMA379=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4869);  
+			stream_COMMA.add(COMMA379);
+
+			pushFollow(FOLLOW_label_ref_in_insn_format22t4871);
+			label_ref380=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(label_ref380.getTree());
+			// AST REWRITE
+			// elements: REGISTER, INSTRUCTION_FORMAT22t, REGISTER, label_ref
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 982:5: -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref )
+			{
+				// smaliParser.g:982:8: ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22t, (retval.start), "I_STATEMENT_FFORMAT22t"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT22t.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_label_ref.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format22t"
+
+
+	public static class insn_format22x_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format22x"
+	// smaliParser.g:984:1: insn_format22x : INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) ;
+	public final smaliParser.insn_format22x_return insn_format22x() throws RecognitionException {
+		smaliParser.insn_format22x_return retval = new smaliParser.insn_format22x_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT22x381=null;
+		Token REGISTER382=null;
+		Token COMMA383=null;
+		Token REGISTER384=null;
+
+		CommonTree INSTRUCTION_FORMAT22x381_tree=null;
+		CommonTree REGISTER382_tree=null;
+		CommonTree COMMA383_tree=null;
+		CommonTree REGISTER384_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22x");
+
+		try {
+			// smaliParser.g:985:3: ( INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) )
+			// smaliParser.g:986:5: INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER
+			{
+			INSTRUCTION_FORMAT22x381=(Token)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x4905);  
+			stream_INSTRUCTION_FORMAT22x.add(INSTRUCTION_FORMAT22x381);
+
+			REGISTER382=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4907);  
+			stream_REGISTER.add(REGISTER382);
+
+			COMMA383=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22x4909);  
+			stream_COMMA.add(COMMA383);
+
+			REGISTER384=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4911);  
+			stream_REGISTER.add(REGISTER384);
+
+			// AST REWRITE
+			// elements: REGISTER, REGISTER, INSTRUCTION_FORMAT22x
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 987:5: -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER )
+			{
+				// smaliParser.g:987:8: ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22x, (retval.start), "I_STATEMENT_FORMAT22x"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT22x.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format22x"
+
+
+	public static class insn_format23x_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format23x"
+	// smaliParser.g:989:1: insn_format23x : INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) ;
+	public final smaliParser.insn_format23x_return insn_format23x() throws RecognitionException {
+		smaliParser.insn_format23x_return retval = new smaliParser.insn_format23x_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT23x385=null;
+		Token REGISTER386=null;
+		Token COMMA387=null;
+		Token REGISTER388=null;
+		Token COMMA389=null;
+		Token REGISTER390=null;
+
+		CommonTree INSTRUCTION_FORMAT23x385_tree=null;
+		CommonTree REGISTER386_tree=null;
+		CommonTree COMMA387_tree=null;
+		CommonTree REGISTER388_tree=null;
+		CommonTree COMMA389_tree=null;
+		CommonTree REGISTER390_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT23x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT23x");
+
+		try {
+			// smaliParser.g:990:3: ( INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) )
+			// smaliParser.g:991:5: INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER
+			{
+			INSTRUCTION_FORMAT23x385=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x4943);  
+			stream_INSTRUCTION_FORMAT23x.add(INSTRUCTION_FORMAT23x385);
+
+			REGISTER386=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4945);  
+			stream_REGISTER.add(REGISTER386);
+
+			COMMA387=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4947);  
+			stream_COMMA.add(COMMA387);
+
+			REGISTER388=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4949);  
+			stream_REGISTER.add(REGISTER388);
+
+			COMMA389=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4951);  
+			stream_COMMA.add(COMMA389);
+
+			REGISTER390=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4953);  
+			stream_REGISTER.add(REGISTER390);
+
+			// AST REWRITE
+			// elements: REGISTER, REGISTER, INSTRUCTION_FORMAT23x, REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 992:5: -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER )
+			{
+				// smaliParser.g:992:8: ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT23x, (retval.start), "I_STATEMENT_FORMAT23x"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT23x.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format23x"
+
+
+	public static class insn_format30t_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format30t"
+	// smaliParser.g:994:1: insn_format30t : INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) ;
+	public final smaliParser.insn_format30t_return insn_format30t() throws RecognitionException {
+		smaliParser.insn_format30t_return retval = new smaliParser.insn_format30t_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT30t391=null;
+		ParserRuleReturnScope label_ref392 =null;
+
+		CommonTree INSTRUCTION_FORMAT30t391_tree=null;
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT30t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT30t");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+
+		try {
+			// smaliParser.g:995:3: ( INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) )
+			// smaliParser.g:996:5: INSTRUCTION_FORMAT30t label_ref
+			{
+			INSTRUCTION_FORMAT30t391=(Token)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t4987);  
+			stream_INSTRUCTION_FORMAT30t.add(INSTRUCTION_FORMAT30t391);
+
+			pushFollow(FOLLOW_label_ref_in_insn_format30t4989);
+			label_ref392=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(label_ref392.getTree());
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT30t, label_ref
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 997:5: -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref )
+			{
+				// smaliParser.g:997:8: ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT30t, (retval.start), "I_STATEMENT_FORMAT30t"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT30t.nextNode());
+				adaptor.addChild(root_1, stream_label_ref.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format30t"
+
+
+	public static class insn_format31c_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format31c"
+	// smaliParser.g:999:1: insn_format31c : INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) ;
+	public final smaliParser.insn_format31c_return insn_format31c() throws RecognitionException {
+		smaliParser.insn_format31c_return retval = new smaliParser.insn_format31c_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT31c393=null;
+		Token REGISTER394=null;
+		Token COMMA395=null;
+		Token STRING_LITERAL396=null;
+
+		CommonTree INSTRUCTION_FORMAT31c393_tree=null;
+		CommonTree REGISTER394_tree=null;
+		CommonTree COMMA395_tree=null;
+		CommonTree STRING_LITERAL396_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT31c=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT31c");
+		RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL");
+
+		try {
+			// smaliParser.g:1000:3: ( INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) )
+			// smaliParser.g:1001:5: INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL
+			{
+			INSTRUCTION_FORMAT31c393=(Token)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c5019);  
+			stream_INSTRUCTION_FORMAT31c.add(INSTRUCTION_FORMAT31c393);
+
+			REGISTER394=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c5021);  
+			stream_REGISTER.add(REGISTER394);
+
+			COMMA395=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31c5023);  
+			stream_COMMA.add(COMMA395);
+
+			STRING_LITERAL396=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format31c5025);  
+			stream_STRING_LITERAL.add(STRING_LITERAL396);
+
+			// AST REWRITE
+			// elements: REGISTER, STRING_LITERAL, INSTRUCTION_FORMAT31c
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1002:5: -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL )
+			{
+				// smaliParser.g:1002:7: ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT31c, (retval.start), "I_STATEMENT_FORMAT31c"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT31c.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format31c"
+
+
+	public static class insn_format31i_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format31i"
+	// smaliParser.g:1004:1: insn_format31i : instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) ;
+	public final smaliParser.insn_format31i_return insn_format31i() throws RecognitionException {
+		smaliParser.insn_format31i_return retval = new smaliParser.insn_format31i_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token REGISTER398=null;
+		Token COMMA399=null;
+		ParserRuleReturnScope instruction_format31i397 =null;
+		ParserRuleReturnScope fixed_32bit_literal400 =null;
+
+		CommonTree REGISTER398_tree=null;
+		CommonTree COMMA399_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleSubtreeStream stream_fixed_32bit_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_32bit_literal");
+		RewriteRuleSubtreeStream stream_instruction_format31i=new RewriteRuleSubtreeStream(adaptor,"rule instruction_format31i");
+
+		try {
+			// smaliParser.g:1005:3: ( instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) )
+			// smaliParser.g:1006:5: instruction_format31i REGISTER COMMA fixed_32bit_literal
+			{
+			pushFollow(FOLLOW_instruction_format31i_in_insn_format31i5056);
+			instruction_format31i397=instruction_format31i();
+			state._fsp--;
+
+			stream_instruction_format31i.add(instruction_format31i397.getTree());
+			REGISTER398=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i5058);  
+			stream_REGISTER.add(REGISTER398);
+
+			COMMA399=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31i5060);  
+			stream_COMMA.add(COMMA399);
+
+			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format31i5062);
+			fixed_32bit_literal400=fixed_32bit_literal();
+			state._fsp--;
+
+			stream_fixed_32bit_literal.add(fixed_32bit_literal400.getTree());
+			// AST REWRITE
+			// elements: instruction_format31i, REGISTER, fixed_32bit_literal
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1007:5: -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal )
+			{
+				// smaliParser.g:1007:8: ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT31i, (retval.start), "I_STATEMENT_FORMAT31i"), root_1);
+				adaptor.addChild(root_1, stream_instruction_format31i.nextTree());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_fixed_32bit_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format31i"
+
+
+	public static class insn_format31t_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format31t"
+	// smaliParser.g:1009:1: insn_format31t : INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) ;
+	public final smaliParser.insn_format31t_return insn_format31t() throws RecognitionException {
+		smaliParser.insn_format31t_return retval = new smaliParser.insn_format31t_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT31t401=null;
+		Token REGISTER402=null;
+		Token COMMA403=null;
+		ParserRuleReturnScope label_ref404 =null;
+
+		CommonTree INSTRUCTION_FORMAT31t401_tree=null;
+		CommonTree REGISTER402_tree=null;
+		CommonTree COMMA403_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT31t=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT31t");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+
+		try {
+			// smaliParser.g:1010:3: ( INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) )
+			// smaliParser.g:1011:5: INSTRUCTION_FORMAT31t REGISTER COMMA label_ref
+			{
+			INSTRUCTION_FORMAT31t401=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t5094);  
+			stream_INSTRUCTION_FORMAT31t.add(INSTRUCTION_FORMAT31t401);
+
+			REGISTER402=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t5096);  
+			stream_REGISTER.add(REGISTER402);
+
+			COMMA403=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31t5098);  
+			stream_COMMA.add(COMMA403);
+
+			pushFollow(FOLLOW_label_ref_in_insn_format31t5100);
+			label_ref404=label_ref();
+			state._fsp--;
+
+			stream_label_ref.add(label_ref404.getTree());
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT31t, REGISTER, label_ref
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1012:5: -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref )
+			{
+				// smaliParser.g:1012:8: ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT31t, (retval.start), "I_STATEMENT_FORMAT31t"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT31t.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_label_ref.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format31t"
+
+
+	public static class insn_format32x_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format32x"
+	// smaliParser.g:1014:1: insn_format32x : INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) ;
+	public final smaliParser.insn_format32x_return insn_format32x() throws RecognitionException {
+		smaliParser.insn_format32x_return retval = new smaliParser.insn_format32x_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT32x405=null;
+		Token REGISTER406=null;
+		Token COMMA407=null;
+		Token REGISTER408=null;
+
+		CommonTree INSTRUCTION_FORMAT32x405_tree=null;
+		CommonTree REGISTER406_tree=null;
+		CommonTree COMMA407_tree=null;
+		CommonTree REGISTER408_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT32x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT32x");
+
+		try {
+			// smaliParser.g:1015:3: ( INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) )
+			// smaliParser.g:1016:5: INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER
+			{
+			INSTRUCTION_FORMAT32x405=(Token)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x5132);  
+			stream_INSTRUCTION_FORMAT32x.add(INSTRUCTION_FORMAT32x405);
+
+			REGISTER406=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5134);  
+			stream_REGISTER.add(REGISTER406);
+
+			COMMA407=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format32x5136);  
+			stream_COMMA.add(COMMA407);
+
+			REGISTER408=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5138);  
+			stream_REGISTER.add(REGISTER408);
+
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT32x, REGISTER, REGISTER
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1017:5: -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER )
+			{
+				// smaliParser.g:1017:8: ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT32x, (retval.start), "I_STATEMENT_FORMAT32x"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT32x.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format32x"
+
+
+	public static class insn_format35c_method_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format35c_method"
+	// smaliParser.g:1019:1: insn_format35c_method : INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ;
+	public final smaliParser.insn_format35c_method_return insn_format35c_method() throws RecognitionException {
+		smaliParser.insn_format35c_method_return retval = new smaliParser.insn_format35c_method_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT35c_METHOD409=null;
+		Token OPEN_BRACE410=null;
+		Token CLOSE_BRACE412=null;
+		Token COMMA413=null;
+		ParserRuleReturnScope register_list411 =null;
+		ParserRuleReturnScope method_reference414 =null;
+
+		CommonTree INSTRUCTION_FORMAT35c_METHOD409_tree=null;
+		CommonTree OPEN_BRACE410_tree=null;
+		CommonTree CLOSE_BRACE412_tree=null;
+		CommonTree COMMA413_tree=null;
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT35c_METHOD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT35c_METHOD");
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_OPEN_BRACE=new RewriteRuleTokenStream(adaptor,"token OPEN_BRACE");
+		RewriteRuleTokenStream stream_CLOSE_BRACE=new RewriteRuleTokenStream(adaptor,"token CLOSE_BRACE");
+		RewriteRuleSubtreeStream stream_method_reference=new RewriteRuleSubtreeStream(adaptor,"rule method_reference");
+		RewriteRuleSubtreeStream stream_register_list=new RewriteRuleSubtreeStream(adaptor,"rule register_list");
+
+		try {
+			// smaliParser.g:1020:3: ( INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) )
+			// smaliParser.g:1021:5: INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+			{
+			INSTRUCTION_FORMAT35c_METHOD409=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method5170);  
+			stream_INSTRUCTION_FORMAT35c_METHOD.add(INSTRUCTION_FORMAT35c_METHOD409);
+
+			OPEN_BRACE410=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method5172);  
+			stream_OPEN_BRACE.add(OPEN_BRACE410);
+
+			pushFollow(FOLLOW_register_list_in_insn_format35c_method5174);
+			register_list411=register_list();
+			state._fsp--;
+
+			stream_register_list.add(register_list411.getTree());
+			CLOSE_BRACE412=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method5176);  
+			stream_CLOSE_BRACE.add(CLOSE_BRACE412);
+
+			COMMA413=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method5178);  
+			stream_COMMA.add(COMMA413);
+
+			pushFollow(FOLLOW_method_reference_in_insn_format35c_method5180);
+			method_reference414=method_reference();
+			state._fsp--;
+
+			stream_method_reference.add(method_reference414.getTree());
+			// AST REWRITE
+			// elements: INSTRUCTION_FORMAT35c_METHOD, register_list, method_reference
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1022:5: -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference )
+			{
+				// smaliParser.g:1022:8: ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT35c_METHOD, (retval.start), "I_STATEMENT_FORMAT35c_METHOD"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT35c_METHOD.nextNode());
+				adaptor.addChild(root_1, stream_register_list.nextTree());
+				adaptor.addChild(root_1, stream_method_reference.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format35c_method"
+
+
+	public static class insn_format35c_type_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format35c_type"
+	// smaliParser.g:1024:1: insn_format35c_type : INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ;
+	public final smaliParser.insn_format35c_type_return insn_format35c_type() throws RecognitionException {
+		smaliParser.insn_format35c_type_return retval = new smaliParser.insn_format35c_type_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT35c_TYPE415=null;
+		Token OPEN_BRACE416=null;
+		Token CLOSE_BRACE418=null;
+		Token COMMA419=null;
+		ParserRuleReturnScope register_list417 =null;
+		ParserRuleReturnScope nonvoid_type_descriptor420 =null;
+
+		CommonTree INSTRUCTION_FORMAT35c_TYPE415_tree=null;
+		CommonTree OPEN_BRACE416_tree=null;
+		CommonTree CLOSE_BRACE418_tree=null;
+		CommonTree COMMA419_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT35c_TYPE=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT35c_TYPE");
+		RewriteRuleTokenStream stream_OPEN_BRACE=new RewriteRuleTokenStream(adaptor,"token OPEN_BRACE");
+		RewriteRuleTokenStream stream_CLOSE_BRACE=new RewriteRuleTokenStream(adaptor,"token CLOSE_BRACE");
+		RewriteRuleSubtreeStream stream_register_list=new RewriteRuleSubtreeStream(adaptor,"rule register_list");
+		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
+
+		try {
+			// smaliParser.g:1025:3: ( INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) )
+			// smaliParser.g:1026:5: INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor
+			{
+			INSTRUCTION_FORMAT35c_TYPE415=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type5212);  
+			stream_INSTRUCTION_FORMAT35c_TYPE.add(INSTRUCTION_FORMAT35c_TYPE415);
+
+			OPEN_BRACE416=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_type5214);  
+			stream_OPEN_BRACE.add(OPEN_BRACE416);
+
+			pushFollow(FOLLOW_register_list_in_insn_format35c_type5216);
+			register_list417=register_list();
+			state._fsp--;
+
+			stream_register_list.add(register_list417.getTree());
+			CLOSE_BRACE418=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_type5218);  
+			stream_CLOSE_BRACE.add(CLOSE_BRACE418);
+
+			COMMA419=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_type5220);  
+			stream_COMMA.add(COMMA419);
+
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format35c_type5222);
+			nonvoid_type_descriptor420=nonvoid_type_descriptor();
+			state._fsp--;
+
+			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor420.getTree());
+			// AST REWRITE
+			// elements: register_list, INSTRUCTION_FORMAT35c_TYPE, nonvoid_type_descriptor
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1027:5: -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor )
+			{
+				// smaliParser.g:1027:8: ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT35c_TYPE, (retval.start), "I_STATEMENT_FORMAT35c_TYPE"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT35c_TYPE.nextNode());
+				adaptor.addChild(root_1, stream_register_list.nextTree());
+				adaptor.addChild(root_1, stream_nonvoid_type_descriptor.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format35c_type"
+
+
+	public static class insn_format35c_method_odex_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format35c_method_odex"
+	// smaliParser.g:1029:1: insn_format35c_method_odex : INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ;
+	public final smaliParser.insn_format35c_method_odex_return insn_format35c_method_odex() throws RecognitionException {
+		smaliParser.insn_format35c_method_odex_return retval = new smaliParser.insn_format35c_method_odex_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT35c_METHOD_ODEX421=null;
+		Token OPEN_BRACE422=null;
+		Token CLOSE_BRACE424=null;
+		Token COMMA425=null;
+		ParserRuleReturnScope register_list423 =null;
+		ParserRuleReturnScope method_reference426 =null;
+
+		CommonTree INSTRUCTION_FORMAT35c_METHOD_ODEX421_tree=null;
+		CommonTree OPEN_BRACE422_tree=null;
+		CommonTree CLOSE_BRACE424_tree=null;
+		CommonTree COMMA425_tree=null;
+
+		try {
+			// smaliParser.g:1030:3: ( INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference )
+			// smaliParser.g:1031:5: INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			INSTRUCTION_FORMAT35c_METHOD_ODEX421=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_insn_format35c_method_odex5254); 
+			INSTRUCTION_FORMAT35c_METHOD_ODEX421_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT35c_METHOD_ODEX421);
+			adaptor.addChild(root_0, INSTRUCTION_FORMAT35c_METHOD_ODEX421_tree);
+
+			OPEN_BRACE422=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method_odex5256); 
+			OPEN_BRACE422_tree = (CommonTree)adaptor.create(OPEN_BRACE422);
+			adaptor.addChild(root_0, OPEN_BRACE422_tree);
+
+			pushFollow(FOLLOW_register_list_in_insn_format35c_method_odex5258);
+			register_list423=register_list();
+			state._fsp--;
+
+			adaptor.addChild(root_0, register_list423.getTree());
+
+			CLOSE_BRACE424=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method_odex5260); 
+			CLOSE_BRACE424_tree = (CommonTree)adaptor.create(CLOSE_BRACE424);
+			adaptor.addChild(root_0, CLOSE_BRACE424_tree);
+
+			COMMA425=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method_odex5262); 
+			COMMA425_tree = (CommonTree)adaptor.create(COMMA425);
+			adaptor.addChild(root_0, COMMA425_tree);
+
+			pushFollow(FOLLOW_method_reference_in_insn_format35c_method_odex5264);
+			method_reference426=method_reference();
+			state._fsp--;
+
+			adaptor.addChild(root_0, method_reference426.getTree());
+
+
+			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT35c_METHOD_ODEX421!=null?INSTRUCTION_FORMAT35c_METHOD_ODEX421.getText():null));
+			    
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format35c_method_odex"
+
+
+	public static class insn_format35mi_method_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format35mi_method"
+	// smaliParser.g:1036:1: insn_format35mi_method : INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX ;
+	public final smaliParser.insn_format35mi_method_return insn_format35mi_method() throws RecognitionException {
+		smaliParser.insn_format35mi_method_return retval = new smaliParser.insn_format35mi_method_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT35mi_METHOD427=null;
+		Token OPEN_BRACE428=null;
+		Token CLOSE_BRACE430=null;
+		Token COMMA431=null;
+		Token INLINE_INDEX432=null;
+		ParserRuleReturnScope register_list429 =null;
+
+		CommonTree INSTRUCTION_FORMAT35mi_METHOD427_tree=null;
+		CommonTree OPEN_BRACE428_tree=null;
+		CommonTree CLOSE_BRACE430_tree=null;
+		CommonTree COMMA431_tree=null;
+		CommonTree INLINE_INDEX432_tree=null;
+
+		try {
+			// smaliParser.g:1037:3: ( INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX )
+			// smaliParser.g:1038:5: INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			INSTRUCTION_FORMAT35mi_METHOD427=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_insn_format35mi_method5285); 
+			INSTRUCTION_FORMAT35mi_METHOD427_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT35mi_METHOD427);
+			adaptor.addChild(root_0, INSTRUCTION_FORMAT35mi_METHOD427_tree);
+
+			OPEN_BRACE428=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35mi_method5287); 
+			OPEN_BRACE428_tree = (CommonTree)adaptor.create(OPEN_BRACE428);
+			adaptor.addChild(root_0, OPEN_BRACE428_tree);
+
+			pushFollow(FOLLOW_register_list_in_insn_format35mi_method5289);
+			register_list429=register_list();
+			state._fsp--;
+
+			adaptor.addChild(root_0, register_list429.getTree());
+
+			CLOSE_BRACE430=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35mi_method5291); 
+			CLOSE_BRACE430_tree = (CommonTree)adaptor.create(CLOSE_BRACE430);
+			adaptor.addChild(root_0, CLOSE_BRACE430_tree);
+
+			COMMA431=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35mi_method5293); 
+			COMMA431_tree = (CommonTree)adaptor.create(COMMA431);
+			adaptor.addChild(root_0, COMMA431_tree);
+
+			INLINE_INDEX432=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format35mi_method5295); 
+			INLINE_INDEX432_tree = (CommonTree)adaptor.create(INLINE_INDEX432);
+			adaptor.addChild(root_0, INLINE_INDEX432_tree);
+
+
+			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT35mi_METHOD427!=null?INSTRUCTION_FORMAT35mi_METHOD427.getText():null));
+			    
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format35mi_method"
+
+
+	public static class insn_format35ms_method_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format35ms_method"
+	// smaliParser.g:1043:1: insn_format35ms_method : INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX ;
+	public final smaliParser.insn_format35ms_method_return insn_format35ms_method() throws RecognitionException {
+		smaliParser.insn_format35ms_method_return retval = new smaliParser.insn_format35ms_method_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT35ms_METHOD433=null;
+		Token OPEN_BRACE434=null;
+		Token CLOSE_BRACE436=null;
+		Token COMMA437=null;
+		Token VTABLE_INDEX438=null;
+		ParserRuleReturnScope register_list435 =null;
+
+		CommonTree INSTRUCTION_FORMAT35ms_METHOD433_tree=null;
+		CommonTree OPEN_BRACE434_tree=null;
+		CommonTree CLOSE_BRACE436_tree=null;
+		CommonTree COMMA437_tree=null;
+		CommonTree VTABLE_INDEX438_tree=null;
+
+		try {
+			// smaliParser.g:1044:3: ( INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX )
+			// smaliParser.g:1045:5: INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			INSTRUCTION_FORMAT35ms_METHOD433=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_insn_format35ms_method5316); 
+			INSTRUCTION_FORMAT35ms_METHOD433_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT35ms_METHOD433);
+			adaptor.addChild(root_0, INSTRUCTION_FORMAT35ms_METHOD433_tree);
+
+			OPEN_BRACE434=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35ms_method5318); 
+			OPEN_BRACE434_tree = (CommonTree)adaptor.create(OPEN_BRACE434);
+			adaptor.addChild(root_0, OPEN_BRACE434_tree);
+
+			pushFollow(FOLLOW_register_list_in_insn_format35ms_method5320);
+			register_list435=register_list();
+			state._fsp--;
+
+			adaptor.addChild(root_0, register_list435.getTree());
+
+			CLOSE_BRACE436=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35ms_method5322); 
+			CLOSE_BRACE436_tree = (CommonTree)adaptor.create(CLOSE_BRACE436);
+			adaptor.addChild(root_0, CLOSE_BRACE436_tree);
+
+			COMMA437=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35ms_method5324); 
+			COMMA437_tree = (CommonTree)adaptor.create(COMMA437);
+			adaptor.addChild(root_0, COMMA437_tree);
+
+			VTABLE_INDEX438=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format35ms_method5326); 
+			VTABLE_INDEX438_tree = (CommonTree)adaptor.create(VTABLE_INDEX438);
+			adaptor.addChild(root_0, VTABLE_INDEX438_tree);
+
+
+			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT35ms_METHOD433!=null?INSTRUCTION_FORMAT35ms_METHOD433.getText():null));
+			    
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format35ms_method"
+
+
+	public static class insn_format3rc_method_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format3rc_method"
+	// smaliParser.g:1050:1: insn_format3rc_method : INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ;
+	public final smaliParser.insn_format3rc_method_return insn_format3rc_method() throws RecognitionException {
+		smaliParser.insn_format3rc_method_return retval = new smaliParser.insn_format3rc_method_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT3rc_METHOD439=null;
+		Token OPEN_BRACE440=null;
+		Token CLOSE_BRACE442=null;
+		Token COMMA443=null;
+		ParserRuleReturnScope register_range441 =null;
+		ParserRuleReturnScope method_reference444 =null;
+
+		CommonTree INSTRUCTION_FORMAT3rc_METHOD439_tree=null;
+		CommonTree OPEN_BRACE440_tree=null;
+		CommonTree CLOSE_BRACE442_tree=null;
+		CommonTree COMMA443_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT3rc_METHOD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT3rc_METHOD");
+		RewriteRuleTokenStream stream_OPEN_BRACE=new RewriteRuleTokenStream(adaptor,"token OPEN_BRACE");
+		RewriteRuleTokenStream stream_CLOSE_BRACE=new RewriteRuleTokenStream(adaptor,"token CLOSE_BRACE");
+		RewriteRuleSubtreeStream stream_method_reference=new RewriteRuleSubtreeStream(adaptor,"rule method_reference");
+		RewriteRuleSubtreeStream stream_register_range=new RewriteRuleSubtreeStream(adaptor,"rule register_range");
+
+		try {
+			// smaliParser.g:1051:3: ( INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) )
+			// smaliParser.g:1052:5: INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference
+			{
+			INSTRUCTION_FORMAT3rc_METHOD439=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method5347);  
+			stream_INSTRUCTION_FORMAT3rc_METHOD.add(INSTRUCTION_FORMAT3rc_METHOD439);
+
+			OPEN_BRACE440=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method5349);  
+			stream_OPEN_BRACE.add(OPEN_BRACE440);
+
+			pushFollow(FOLLOW_register_range_in_insn_format3rc_method5351);
+			register_range441=register_range();
+			state._fsp--;
+
+			stream_register_range.add(register_range441.getTree());
+			CLOSE_BRACE442=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method5353);  
+			stream_CLOSE_BRACE.add(CLOSE_BRACE442);
+
+			COMMA443=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method5355);  
+			stream_COMMA.add(COMMA443);
+
+			pushFollow(FOLLOW_method_reference_in_insn_format3rc_method5357);
+			method_reference444=method_reference();
+			state._fsp--;
+
+			stream_method_reference.add(method_reference444.getTree());
+			// AST REWRITE
+			// elements: register_range, INSTRUCTION_FORMAT3rc_METHOD, method_reference
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1053:5: -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference )
+			{
+				// smaliParser.g:1053:8: ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT3rc_METHOD, (retval.start), "I_STATEMENT_FORMAT3rc_METHOD"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT3rc_METHOD.nextNode());
+				adaptor.addChild(root_1, stream_register_range.nextTree());
+				adaptor.addChild(root_1, stream_method_reference.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format3rc_method"
+
+
+	public static class insn_format3rc_method_odex_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format3rc_method_odex"
+	// smaliParser.g:1055:1: insn_format3rc_method_odex : INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ;
+	public final smaliParser.insn_format3rc_method_odex_return insn_format3rc_method_odex() throws RecognitionException {
+		smaliParser.insn_format3rc_method_odex_return retval = new smaliParser.insn_format3rc_method_odex_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT3rc_METHOD_ODEX445=null;
+		Token OPEN_BRACE446=null;
+		Token CLOSE_BRACE448=null;
+		Token COMMA449=null;
+		ParserRuleReturnScope register_list447 =null;
+		ParserRuleReturnScope method_reference450 =null;
+
+		CommonTree INSTRUCTION_FORMAT3rc_METHOD_ODEX445_tree=null;
+		CommonTree OPEN_BRACE446_tree=null;
+		CommonTree CLOSE_BRACE448_tree=null;
+		CommonTree COMMA449_tree=null;
+
+		try {
+			// smaliParser.g:1056:3: ( INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference )
+			// smaliParser.g:1057:5: INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			INSTRUCTION_FORMAT3rc_METHOD_ODEX445=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_ODEX_in_insn_format3rc_method_odex5389); 
+			INSTRUCTION_FORMAT3rc_METHOD_ODEX445_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT3rc_METHOD_ODEX445);
+			adaptor.addChild(root_0, INSTRUCTION_FORMAT3rc_METHOD_ODEX445_tree);
+
+			OPEN_BRACE446=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method_odex5391); 
+			OPEN_BRACE446_tree = (CommonTree)adaptor.create(OPEN_BRACE446);
+			adaptor.addChild(root_0, OPEN_BRACE446_tree);
+
+			pushFollow(FOLLOW_register_list_in_insn_format3rc_method_odex5393);
+			register_list447=register_list();
+			state._fsp--;
+
+			adaptor.addChild(root_0, register_list447.getTree());
+
+			CLOSE_BRACE448=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method_odex5395); 
+			CLOSE_BRACE448_tree = (CommonTree)adaptor.create(CLOSE_BRACE448);
+			adaptor.addChild(root_0, CLOSE_BRACE448_tree);
+
+			COMMA449=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method_odex5397); 
+			COMMA449_tree = (CommonTree)adaptor.create(COMMA449);
+			adaptor.addChild(root_0, COMMA449_tree);
+
+			pushFollow(FOLLOW_method_reference_in_insn_format3rc_method_odex5399);
+			method_reference450=method_reference();
+			state._fsp--;
+
+			adaptor.addChild(root_0, method_reference450.getTree());
+
+
+			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT3rc_METHOD_ODEX445!=null?INSTRUCTION_FORMAT3rc_METHOD_ODEX445.getText():null));
+			    
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format3rc_method_odex"
+
+
+	public static class insn_format3rc_type_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format3rc_type"
+	// smaliParser.g:1062:1: insn_format3rc_type : INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ;
+	public final smaliParser.insn_format3rc_type_return insn_format3rc_type() throws RecognitionException {
+		smaliParser.insn_format3rc_type_return retval = new smaliParser.insn_format3rc_type_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT3rc_TYPE451=null;
+		Token OPEN_BRACE452=null;
+		Token CLOSE_BRACE454=null;
+		Token COMMA455=null;
+		ParserRuleReturnScope register_range453 =null;
+		ParserRuleReturnScope nonvoid_type_descriptor456 =null;
+
+		CommonTree INSTRUCTION_FORMAT3rc_TYPE451_tree=null;
+		CommonTree OPEN_BRACE452_tree=null;
+		CommonTree CLOSE_BRACE454_tree=null;
+		CommonTree COMMA455_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_OPEN_BRACE=new RewriteRuleTokenStream(adaptor,"token OPEN_BRACE");
+		RewriteRuleTokenStream stream_CLOSE_BRACE=new RewriteRuleTokenStream(adaptor,"token CLOSE_BRACE");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT3rc_TYPE=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT3rc_TYPE");
+		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
+		RewriteRuleSubtreeStream stream_register_range=new RewriteRuleSubtreeStream(adaptor,"rule register_range");
+
+		try {
+			// smaliParser.g:1063:3: ( INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) )
+			// smaliParser.g:1064:5: INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor
+			{
+			INSTRUCTION_FORMAT3rc_TYPE451=(Token)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type5420);  
+			stream_INSTRUCTION_FORMAT3rc_TYPE.add(INSTRUCTION_FORMAT3rc_TYPE451);
+
+			OPEN_BRACE452=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_type5422);  
+			stream_OPEN_BRACE.add(OPEN_BRACE452);
+
+			pushFollow(FOLLOW_register_range_in_insn_format3rc_type5424);
+			register_range453=register_range();
+			state._fsp--;
+
+			stream_register_range.add(register_range453.getTree());
+			CLOSE_BRACE454=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_type5426);  
+			stream_CLOSE_BRACE.add(CLOSE_BRACE454);
+
+			COMMA455=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_type5428);  
+			stream_COMMA.add(COMMA455);
+
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format3rc_type5430);
+			nonvoid_type_descriptor456=nonvoid_type_descriptor();
+			state._fsp--;
+
+			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor456.getTree());
+			// AST REWRITE
+			// elements: nonvoid_type_descriptor, INSTRUCTION_FORMAT3rc_TYPE, register_range
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1065:5: -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor )
+			{
+				// smaliParser.g:1065:8: ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT3rc_TYPE, (retval.start), "I_STATEMENT_FORMAT3rc_TYPE"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT3rc_TYPE.nextNode());
+				adaptor.addChild(root_1, stream_register_range.nextTree());
+				adaptor.addChild(root_1, stream_nonvoid_type_descriptor.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format3rc_type"
+
+
+	public static class insn_format3rmi_method_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format3rmi_method"
+	// smaliParser.g:1067:1: insn_format3rmi_method : INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX ;
+	public final smaliParser.insn_format3rmi_method_return insn_format3rmi_method() throws RecognitionException {
+		smaliParser.insn_format3rmi_method_return retval = new smaliParser.insn_format3rmi_method_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT3rmi_METHOD457=null;
+		Token OPEN_BRACE458=null;
+		Token CLOSE_BRACE460=null;
+		Token COMMA461=null;
+		Token INLINE_INDEX462=null;
+		ParserRuleReturnScope register_range459 =null;
+
+		CommonTree INSTRUCTION_FORMAT3rmi_METHOD457_tree=null;
+		CommonTree OPEN_BRACE458_tree=null;
+		CommonTree CLOSE_BRACE460_tree=null;
+		CommonTree COMMA461_tree=null;
+		CommonTree INLINE_INDEX462_tree=null;
+
+		try {
+			// smaliParser.g:1068:3: ( INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX )
+			// smaliParser.g:1069:5: INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			INSTRUCTION_FORMAT3rmi_METHOD457=(Token)match(input,INSTRUCTION_FORMAT3rmi_METHOD,FOLLOW_INSTRUCTION_FORMAT3rmi_METHOD_in_insn_format3rmi_method5462); 
+			INSTRUCTION_FORMAT3rmi_METHOD457_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT3rmi_METHOD457);
+			adaptor.addChild(root_0, INSTRUCTION_FORMAT3rmi_METHOD457_tree);
+
+			OPEN_BRACE458=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rmi_method5464); 
+			OPEN_BRACE458_tree = (CommonTree)adaptor.create(OPEN_BRACE458);
+			adaptor.addChild(root_0, OPEN_BRACE458_tree);
+
+			pushFollow(FOLLOW_register_range_in_insn_format3rmi_method5466);
+			register_range459=register_range();
+			state._fsp--;
+
+			adaptor.addChild(root_0, register_range459.getTree());
+
+			CLOSE_BRACE460=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rmi_method5468); 
+			CLOSE_BRACE460_tree = (CommonTree)adaptor.create(CLOSE_BRACE460);
+			adaptor.addChild(root_0, CLOSE_BRACE460_tree);
+
+			COMMA461=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rmi_method5470); 
+			COMMA461_tree = (CommonTree)adaptor.create(COMMA461);
+			adaptor.addChild(root_0, COMMA461_tree);
+
+			INLINE_INDEX462=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format3rmi_method5472); 
+			INLINE_INDEX462_tree = (CommonTree)adaptor.create(INLINE_INDEX462);
+			adaptor.addChild(root_0, INLINE_INDEX462_tree);
+
+
+			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT3rmi_METHOD457!=null?INSTRUCTION_FORMAT3rmi_METHOD457.getText():null));
+			    
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format3rmi_method"
+
+
+	public static class insn_format3rms_method_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format3rms_method"
+	// smaliParser.g:1074:1: insn_format3rms_method : INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX ;
+	public final smaliParser.insn_format3rms_method_return insn_format3rms_method() throws RecognitionException {
+		smaliParser.insn_format3rms_method_return retval = new smaliParser.insn_format3rms_method_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT3rms_METHOD463=null;
+		Token OPEN_BRACE464=null;
+		Token CLOSE_BRACE466=null;
+		Token COMMA467=null;
+		Token VTABLE_INDEX468=null;
+		ParserRuleReturnScope register_range465 =null;
+
+		CommonTree INSTRUCTION_FORMAT3rms_METHOD463_tree=null;
+		CommonTree OPEN_BRACE464_tree=null;
+		CommonTree CLOSE_BRACE466_tree=null;
+		CommonTree COMMA467_tree=null;
+		CommonTree VTABLE_INDEX468_tree=null;
+
+		try {
+			// smaliParser.g:1075:3: ( INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX )
+			// smaliParser.g:1076:5: INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX
+			{
+			root_0 = (CommonTree)adaptor.nil();
+
+
+			INSTRUCTION_FORMAT3rms_METHOD463=(Token)match(input,INSTRUCTION_FORMAT3rms_METHOD,FOLLOW_INSTRUCTION_FORMAT3rms_METHOD_in_insn_format3rms_method5493); 
+			INSTRUCTION_FORMAT3rms_METHOD463_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT3rms_METHOD463);
+			adaptor.addChild(root_0, INSTRUCTION_FORMAT3rms_METHOD463_tree);
+
+			OPEN_BRACE464=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rms_method5495); 
+			OPEN_BRACE464_tree = (CommonTree)adaptor.create(OPEN_BRACE464);
+			adaptor.addChild(root_0, OPEN_BRACE464_tree);
+
+			pushFollow(FOLLOW_register_range_in_insn_format3rms_method5497);
+			register_range465=register_range();
+			state._fsp--;
+
+			adaptor.addChild(root_0, register_range465.getTree());
+
+			CLOSE_BRACE466=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rms_method5499); 
+			CLOSE_BRACE466_tree = (CommonTree)adaptor.create(CLOSE_BRACE466);
+			adaptor.addChild(root_0, CLOSE_BRACE466_tree);
+
+			COMMA467=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rms_method5501); 
+			COMMA467_tree = (CommonTree)adaptor.create(COMMA467);
+			adaptor.addChild(root_0, COMMA467_tree);
+
+			VTABLE_INDEX468=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format3rms_method5503); 
+			VTABLE_INDEX468_tree = (CommonTree)adaptor.create(VTABLE_INDEX468);
+			adaptor.addChild(root_0, VTABLE_INDEX468_tree);
+
+
+			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT3rms_METHOD463!=null?INSTRUCTION_FORMAT3rms_METHOD463.getText():null));
+			    
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format3rms_method"
+
+
+	public static class insn_format45cc_method_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format45cc_method"
+	// smaliParser.g:1081:1: insn_format45cc_method : INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ;
+	public final smaliParser.insn_format45cc_method_return insn_format45cc_method() throws RecognitionException {
+		smaliParser.insn_format45cc_method_return retval = new smaliParser.insn_format45cc_method_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT45cc_METHOD469=null;
+		Token OPEN_BRACE470=null;
+		Token CLOSE_BRACE472=null;
+		Token COMMA473=null;
+		Token COMMA475=null;
+		ParserRuleReturnScope register_list471 =null;
+		ParserRuleReturnScope method_reference474 =null;
+		ParserRuleReturnScope method_prototype476 =null;
+
+		CommonTree INSTRUCTION_FORMAT45cc_METHOD469_tree=null;
+		CommonTree OPEN_BRACE470_tree=null;
+		CommonTree CLOSE_BRACE472_tree=null;
+		CommonTree COMMA473_tree=null;
+		CommonTree COMMA475_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT45cc_METHOD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT45cc_METHOD");
+		RewriteRuleTokenStream stream_OPEN_BRACE=new RewriteRuleTokenStream(adaptor,"token OPEN_BRACE");
+		RewriteRuleTokenStream stream_CLOSE_BRACE=new RewriteRuleTokenStream(adaptor,"token CLOSE_BRACE");
+		RewriteRuleSubtreeStream stream_method_reference=new RewriteRuleSubtreeStream(adaptor,"rule method_reference");
+		RewriteRuleSubtreeStream stream_method_prototype=new RewriteRuleSubtreeStream(adaptor,"rule method_prototype");
+		RewriteRuleSubtreeStream stream_register_list=new RewriteRuleSubtreeStream(adaptor,"rule register_list");
+
+		try {
+			// smaliParser.g:1082:3: ( INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) )
+			// smaliParser.g:1083:5: INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype
+			{
+			INSTRUCTION_FORMAT45cc_METHOD469=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method5524);  
+			stream_INSTRUCTION_FORMAT45cc_METHOD.add(INSTRUCTION_FORMAT45cc_METHOD469);
+
+			OPEN_BRACE470=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format45cc_method5526);  
+			stream_OPEN_BRACE.add(OPEN_BRACE470);
+
+			pushFollow(FOLLOW_register_list_in_insn_format45cc_method5528);
+			register_list471=register_list();
+			state._fsp--;
+
+			stream_register_list.add(register_list471.getTree());
+			CLOSE_BRACE472=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format45cc_method5530);  
+			stream_CLOSE_BRACE.add(CLOSE_BRACE472);
+
+			COMMA473=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5532);  
+			stream_COMMA.add(COMMA473);
+
+			pushFollow(FOLLOW_method_reference_in_insn_format45cc_method5534);
+			method_reference474=method_reference();
+			state._fsp--;
+
+			stream_method_reference.add(method_reference474.getTree());
+			COMMA475=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5536);  
+			stream_COMMA.add(COMMA475);
+
+			pushFollow(FOLLOW_method_prototype_in_insn_format45cc_method5538);
+			method_prototype476=method_prototype();
+			state._fsp--;
+
+			stream_method_prototype.add(method_prototype476.getTree());
+			// AST REWRITE
+			// elements: method_reference, method_prototype, INSTRUCTION_FORMAT45cc_METHOD, register_list
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1084:5: -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype )
+			{
+				// smaliParser.g:1084:8: ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT45cc_METHOD, (retval.start), "I_STATEMENT_FORMAT45cc_METHOD"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT45cc_METHOD.nextNode());
+				adaptor.addChild(root_1, stream_register_list.nextTree());
+				adaptor.addChild(root_1, stream_method_reference.nextTree());
+				adaptor.addChild(root_1, stream_method_prototype.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format45cc_method"
+
+
+	public static class insn_format4rcc_method_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format4rcc_method"
+	// smaliParser.g:1086:1: insn_format4rcc_method : INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ;
+	public final smaliParser.insn_format4rcc_method_return insn_format4rcc_method() throws RecognitionException {
+		smaliParser.insn_format4rcc_method_return retval = new smaliParser.insn_format4rcc_method_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT4rcc_METHOD477=null;
+		Token OPEN_BRACE478=null;
+		Token CLOSE_BRACE480=null;
+		Token COMMA481=null;
+		Token COMMA483=null;
+		ParserRuleReturnScope register_range479 =null;
+		ParserRuleReturnScope method_reference482 =null;
+		ParserRuleReturnScope method_prototype484 =null;
+
+		CommonTree INSTRUCTION_FORMAT4rcc_METHOD477_tree=null;
+		CommonTree OPEN_BRACE478_tree=null;
+		CommonTree CLOSE_BRACE480_tree=null;
+		CommonTree COMMA481_tree=null;
+		CommonTree COMMA483_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_OPEN_BRACE=new RewriteRuleTokenStream(adaptor,"token OPEN_BRACE");
+		RewriteRuleTokenStream stream_CLOSE_BRACE=new RewriteRuleTokenStream(adaptor,"token CLOSE_BRACE");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT4rcc_METHOD=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT4rcc_METHOD");
+		RewriteRuleSubtreeStream stream_method_reference=new RewriteRuleSubtreeStream(adaptor,"rule method_reference");
+		RewriteRuleSubtreeStream stream_method_prototype=new RewriteRuleSubtreeStream(adaptor,"rule method_prototype");
+		RewriteRuleSubtreeStream stream_register_range=new RewriteRuleSubtreeStream(adaptor,"rule register_range");
+
+		try {
+			// smaliParser.g:1087:3: ( INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) )
+			// smaliParser.g:1088:5: INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype
+			{
+			INSTRUCTION_FORMAT4rcc_METHOD477=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method5572);  
+			stream_INSTRUCTION_FORMAT4rcc_METHOD.add(INSTRUCTION_FORMAT4rcc_METHOD477);
+
+			OPEN_BRACE478=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format4rcc_method5574);  
+			stream_OPEN_BRACE.add(OPEN_BRACE478);
+
+			pushFollow(FOLLOW_register_range_in_insn_format4rcc_method5576);
+			register_range479=register_range();
+			state._fsp--;
+
+			stream_register_range.add(register_range479.getTree());
+			CLOSE_BRACE480=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format4rcc_method5578);  
+			stream_CLOSE_BRACE.add(CLOSE_BRACE480);
+
+			COMMA481=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5580);  
+			stream_COMMA.add(COMMA481);
+
+			pushFollow(FOLLOW_method_reference_in_insn_format4rcc_method5582);
+			method_reference482=method_reference();
+			state._fsp--;
+
+			stream_method_reference.add(method_reference482.getTree());
+			COMMA483=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5584);  
+			stream_COMMA.add(COMMA483);
+
+			pushFollow(FOLLOW_method_prototype_in_insn_format4rcc_method5586);
+			method_prototype484=method_prototype();
+			state._fsp--;
+
+			stream_method_prototype.add(method_prototype484.getTree());
+			// AST REWRITE
+			// elements: register_range, INSTRUCTION_FORMAT4rcc_METHOD, method_reference, method_prototype
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1089:5: -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype )
+			{
+				// smaliParser.g:1089:8: ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT4rcc_METHOD, (retval.start), "I_STATEMENT_FORMAT4rcc_METHOD"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT4rcc_METHOD.nextNode());
+				adaptor.addChild(root_1, stream_register_range.nextTree());
+				adaptor.addChild(root_1, stream_method_reference.nextTree());
+				adaptor.addChild(root_1, stream_method_prototype.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format4rcc_method"
+
+
+	public static class insn_format51l_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_format51l"
+	// smaliParser.g:1091:1: insn_format51l : INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) ;
+	public final smaliParser.insn_format51l_return insn_format51l() throws RecognitionException {
+		smaliParser.insn_format51l_return retval = new smaliParser.insn_format51l_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token INSTRUCTION_FORMAT51l485=null;
+		Token REGISTER486=null;
+		Token COMMA487=null;
+		ParserRuleReturnScope fixed_literal488 =null;
+
+		CommonTree INSTRUCTION_FORMAT51l485_tree=null;
+		CommonTree REGISTER486_tree=null;
+		CommonTree COMMA487_tree=null;
+		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
+		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT51l=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT51l");
+		RewriteRuleSubtreeStream stream_fixed_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_literal");
+
+		try {
+			// smaliParser.g:1092:3: ( INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) )
+			// smaliParser.g:1093:5: INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal
+			{
+			INSTRUCTION_FORMAT51l485=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l5620);  
+			stream_INSTRUCTION_FORMAT51l.add(INSTRUCTION_FORMAT51l485);
+
+			REGISTER486=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l5622);  
+			stream_REGISTER.add(REGISTER486);
+
+			COMMA487=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format51l5624);  
+			stream_COMMA.add(COMMA487);
+
+			pushFollow(FOLLOW_fixed_literal_in_insn_format51l5626);
+			fixed_literal488=fixed_literal();
+			state._fsp--;
+
+			stream_fixed_literal.add(fixed_literal488.getTree());
+			// AST REWRITE
+			// elements: REGISTER, INSTRUCTION_FORMAT51l, fixed_literal
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1094:5: -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal )
+			{
+				// smaliParser.g:1094:8: ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT51l, (retval.start), "I_STATEMENT_FORMAT51l"), root_1);
+				adaptor.addChild(root_1, stream_INSTRUCTION_FORMAT51l.nextNode());
+				adaptor.addChild(root_1, stream_REGISTER.nextNode());
+				adaptor.addChild(root_1, stream_fixed_literal.nextTree());
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_format51l"
+
+
+	public static class insn_array_data_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_array_data_directive"
+	// smaliParser.g:1096:1: insn_array_data_directive : ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) ;
+	public final smaliParser.insn_array_data_directive_return insn_array_data_directive() throws RecognitionException {
+		smaliParser.insn_array_data_directive_return retval = new smaliParser.insn_array_data_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token ARRAY_DATA_DIRECTIVE489=null;
+		Token END_ARRAY_DATA_DIRECTIVE492=null;
+		ParserRuleReturnScope parsed_integer_literal490 =null;
+		ParserRuleReturnScope fixed_literal491 =null;
+
+		CommonTree ARRAY_DATA_DIRECTIVE489_tree=null;
+		CommonTree END_ARRAY_DATA_DIRECTIVE492_tree=null;
+		RewriteRuleTokenStream stream_END_ARRAY_DATA_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_ARRAY_DATA_DIRECTIVE");
+		RewriteRuleTokenStream stream_ARRAY_DATA_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token ARRAY_DATA_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_parsed_integer_literal=new RewriteRuleSubtreeStream(adaptor,"rule parsed_integer_literal");
+		RewriteRuleSubtreeStream stream_fixed_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_literal");
+
+		try {
+			// smaliParser.g:1097:3: ( ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) )
+			// smaliParser.g:1097:5: ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE
+			{
+			ARRAY_DATA_DIRECTIVE489=(Token)match(input,ARRAY_DATA_DIRECTIVE,FOLLOW_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5653);  
+			stream_ARRAY_DATA_DIRECTIVE.add(ARRAY_DATA_DIRECTIVE489);
+
+			pushFollow(FOLLOW_parsed_integer_literal_in_insn_array_data_directive5659);
+			parsed_integer_literal490=parsed_integer_literal();
+			state._fsp--;
+
+			stream_parsed_integer_literal.add(parsed_integer_literal490.getTree());
+
+			        int elementWidth = (parsed_integer_literal490!=null?((smaliParser.parsed_integer_literal_return)parsed_integer_literal490).value:0);
+			        if (elementWidth != 4 && elementWidth != 8 && elementWidth != 1 && elementWidth != 2) {
+			            throw new SemanticException(input, (retval.start), "Invalid element width: %d. Must be 1, 2, 4 or 8", elementWidth);
+			        }
+			    
+			// smaliParser.g:1105:5: ( fixed_literal )*
+			loop52:
+			while (true) {
+				int alt52=2;
+				int LA52_0 = input.LA(1);
+				if ( ((LA52_0 >= BOOL_LITERAL && LA52_0 <= BYTE_LITERAL)||LA52_0==CHAR_LITERAL||(LA52_0 >= DOUBLE_LITERAL && LA52_0 <= DOUBLE_LITERAL_OR_ID)||(LA52_0 >= FLOAT_LITERAL && LA52_0 <= FLOAT_LITERAL_OR_ID)||LA52_0==LONG_LITERAL||LA52_0==NEGATIVE_INTEGER_LITERAL||LA52_0==POSITIVE_INTEGER_LITERAL||LA52_0==SHORT_LITERAL) ) {
+					alt52=1;
+				}
+
+				switch (alt52) {
+				case 1 :
+					// smaliParser.g:1105:5: fixed_literal
+					{
+					pushFollow(FOLLOW_fixed_literal_in_insn_array_data_directive5671);
+					fixed_literal491=fixed_literal();
+					state._fsp--;
+
+					stream_fixed_literal.add(fixed_literal491.getTree());
+					}
+					break;
+
+				default :
+					break loop52;
+				}
+			}
+
+			END_ARRAY_DATA_DIRECTIVE492=(Token)match(input,END_ARRAY_DATA_DIRECTIVE,FOLLOW_END_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5674);  
+			stream_END_ARRAY_DATA_DIRECTIVE.add(END_ARRAY_DATA_DIRECTIVE492);
+
+			// AST REWRITE
+			// elements: parsed_integer_literal, fixed_literal
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1107:5: -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) )
+			{
+				// smaliParser.g:1107:8: ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_ARRAY_DATA, (retval.start), "I_STATEMENT_ARRAY_DATA"), root_1);
+				// smaliParser.g:1107:67: ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal )
+				{
+				CommonTree root_2 = (CommonTree)adaptor.nil();
+				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ARRAY_ELEMENT_SIZE, "I_ARRAY_ELEMENT_SIZE"), root_2);
+				adaptor.addChild(root_2, stream_parsed_integer_literal.nextTree());
+				adaptor.addChild(root_1, root_2);
+				}
+
+				// smaliParser.g:1108:8: ^( I_ARRAY_ELEMENTS ( fixed_literal )* )
+				{
+				CommonTree root_2 = (CommonTree)adaptor.nil();
+				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ARRAY_ELEMENTS, "I_ARRAY_ELEMENTS"), root_2);
+				// smaliParser.g:1108:27: ( fixed_literal )*
+				while ( stream_fixed_literal.hasNext() ) {
+					adaptor.addChild(root_2, stream_fixed_literal.nextTree());
+				}
+				stream_fixed_literal.reset();
+
+				adaptor.addChild(root_1, root_2);
+				}
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_array_data_directive"
+
+
+	public static class insn_packed_switch_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_packed_switch_directive"
+	// smaliParser.g:1110:1: insn_packed_switch_directive : PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) ;
+	public final smaliParser.insn_packed_switch_directive_return insn_packed_switch_directive() throws RecognitionException {
+		smaliParser.insn_packed_switch_directive_return retval = new smaliParser.insn_packed_switch_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token PACKED_SWITCH_DIRECTIVE493=null;
+		Token END_PACKED_SWITCH_DIRECTIVE496=null;
+		ParserRuleReturnScope fixed_32bit_literal494 =null;
+		ParserRuleReturnScope label_ref495 =null;
+
+		CommonTree PACKED_SWITCH_DIRECTIVE493_tree=null;
+		CommonTree END_PACKED_SWITCH_DIRECTIVE496_tree=null;
+		RewriteRuleTokenStream stream_END_PACKED_SWITCH_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_PACKED_SWITCH_DIRECTIVE");
+		RewriteRuleTokenStream stream_PACKED_SWITCH_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token PACKED_SWITCH_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_fixed_32bit_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_32bit_literal");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+
+		try {
+			// smaliParser.g:1111:5: ( PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) )
+			// smaliParser.g:1111:9: PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE
+			{
+			PACKED_SWITCH_DIRECTIVE493=(Token)match(input,PACKED_SWITCH_DIRECTIVE,FOLLOW_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5720);  
+			stream_PACKED_SWITCH_DIRECTIVE.add(PACKED_SWITCH_DIRECTIVE493);
+
+			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_packed_switch_directive5726);
+			fixed_32bit_literal494=fixed_32bit_literal();
+			state._fsp--;
+
+			stream_fixed_32bit_literal.add(fixed_32bit_literal494.getTree());
+			// smaliParser.g:1113:5: ( label_ref )*
+			loop53:
+			while (true) {
+				int alt53=2;
+				int LA53_0 = input.LA(1);
+				if ( (LA53_0==COLON) ) {
+					alt53=1;
+				}
+
+				switch (alt53) {
+				case 1 :
+					// smaliParser.g:1113:5: label_ref
+					{
+					pushFollow(FOLLOW_label_ref_in_insn_packed_switch_directive5732);
+					label_ref495=label_ref();
+					state._fsp--;
+
+					stream_label_ref.add(label_ref495.getTree());
+					}
+					break;
+
+				default :
+					break loop53;
+				}
+			}
+
+			END_PACKED_SWITCH_DIRECTIVE496=(Token)match(input,END_PACKED_SWITCH_DIRECTIVE,FOLLOW_END_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5739);  
+			stream_END_PACKED_SWITCH_DIRECTIVE.add(END_PACKED_SWITCH_DIRECTIVE496);
+
+			// AST REWRITE
+			// elements: fixed_32bit_literal, label_ref
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1115:5: -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) )
+			{
+				// smaliParser.g:1115:8: ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_PACKED_SWITCH, (retval.start), "I_STATEMENT_PACKED_SWITCH"), root_1);
+				// smaliParser.g:1116:10: ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal )
+				{
+				CommonTree root_2 = (CommonTree)adaptor.nil();
+				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PACKED_SWITCH_START_KEY, (retval.start), "I_PACKED_SWITCH_START_KEY"), root_2);
+				adaptor.addChild(root_2, stream_fixed_32bit_literal.nextTree());
+				adaptor.addChild(root_1, root_2);
+				}
+
+				// smaliParser.g:1117:10: ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* )
+				{
+				CommonTree root_2 = (CommonTree)adaptor.nil();
+				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PACKED_SWITCH_ELEMENTS, (retval.start), "I_PACKED_SWITCH_ELEMENTS"), root_2);
+				// smaliParser.g:1118:11: ( label_ref )*
+				while ( stream_label_ref.hasNext() ) {
+					adaptor.addChild(root_2, stream_label_ref.nextTree());
+				}
+				stream_label_ref.reset();
+
+				adaptor.addChild(root_1, root_2);
+				}
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_packed_switch_directive"
+
+
+	public static class insn_sparse_switch_directive_return extends ParserRuleReturnScope {
+		CommonTree tree;
+		@Override
+		public CommonTree getTree() { return tree; }
+	};
+
+
+	// $ANTLR start "insn_sparse_switch_directive"
+	// smaliParser.g:1121:1: insn_sparse_switch_directive : SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) ;
+	public final smaliParser.insn_sparse_switch_directive_return insn_sparse_switch_directive() throws RecognitionException {
+		smaliParser.insn_sparse_switch_directive_return retval = new smaliParser.insn_sparse_switch_directive_return();
+		retval.start = input.LT(1);
+
+		CommonTree root_0 = null;
+
+		Token SPARSE_SWITCH_DIRECTIVE497=null;
+		Token ARROW499=null;
+		Token END_SPARSE_SWITCH_DIRECTIVE501=null;
+		ParserRuleReturnScope fixed_32bit_literal498 =null;
+		ParserRuleReturnScope label_ref500 =null;
+
+		CommonTree SPARSE_SWITCH_DIRECTIVE497_tree=null;
+		CommonTree ARROW499_tree=null;
+		CommonTree END_SPARSE_SWITCH_DIRECTIVE501_tree=null;
+		RewriteRuleTokenStream stream_ARROW=new RewriteRuleTokenStream(adaptor,"token ARROW");
+		RewriteRuleTokenStream stream_SPARSE_SWITCH_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token SPARSE_SWITCH_DIRECTIVE");
+		RewriteRuleTokenStream stream_END_SPARSE_SWITCH_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_SPARSE_SWITCH_DIRECTIVE");
+		RewriteRuleSubtreeStream stream_fixed_32bit_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_32bit_literal");
+		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
+
+		try {
+			// smaliParser.g:1122:3: ( SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) )
+			// smaliParser.g:1122:7: SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE
+			{
+			SPARSE_SWITCH_DIRECTIVE497=(Token)match(input,SPARSE_SWITCH_DIRECTIVE,FOLLOW_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5813);  
+			stream_SPARSE_SWITCH_DIRECTIVE.add(SPARSE_SWITCH_DIRECTIVE497);
+
+			// smaliParser.g:1123:5: ( fixed_32bit_literal ARROW label_ref )*
+			loop54:
+			while (true) {
+				int alt54=2;
+				int LA54_0 = input.LA(1);
+				if ( ((LA54_0 >= BOOL_LITERAL && LA54_0 <= BYTE_LITERAL)||LA54_0==CHAR_LITERAL||(LA54_0 >= FLOAT_LITERAL && LA54_0 <= FLOAT_LITERAL_OR_ID)||LA54_0==LONG_LITERAL||LA54_0==NEGATIVE_INTEGER_LITERAL||LA54_0==POSITIVE_INTEGER_LITERAL||LA54_0==SHORT_LITERAL) ) {
+					alt54=1;
+				}
+
+				switch (alt54) {
+				case 1 :
+					// smaliParser.g:1123:6: fixed_32bit_literal ARROW label_ref
+					{
+					pushFollow(FOLLOW_fixed_32bit_literal_in_insn_sparse_switch_directive5820);
+					fixed_32bit_literal498=fixed_32bit_literal();
+					state._fsp--;
+
+					stream_fixed_32bit_literal.add(fixed_32bit_literal498.getTree());
+					ARROW499=(Token)match(input,ARROW,FOLLOW_ARROW_in_insn_sparse_switch_directive5822);  
+					stream_ARROW.add(ARROW499);
+
+					pushFollow(FOLLOW_label_ref_in_insn_sparse_switch_directive5824);
+					label_ref500=label_ref();
+					state._fsp--;
+
+					stream_label_ref.add(label_ref500.getTree());
+					}
+					break;
+
+				default :
+					break loop54;
+				}
+			}
+
+			END_SPARSE_SWITCH_DIRECTIVE501=(Token)match(input,END_SPARSE_SWITCH_DIRECTIVE,FOLLOW_END_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5832);  
+			stream_END_SPARSE_SWITCH_DIRECTIVE.add(END_SPARSE_SWITCH_DIRECTIVE501);
+
+			// AST REWRITE
+			// elements: fixed_32bit_literal, label_ref
+			// token labels: 
+			// rule labels: retval
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
+			retval.tree = root_0;
+			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
+
+			root_0 = (CommonTree)adaptor.nil();
+			// 1125:5: -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) )
+			{
+				// smaliParser.g:1125:8: ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) )
+				{
+				CommonTree root_1 = (CommonTree)adaptor.nil();
+				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_SPARSE_SWITCH, (retval.start), "I_STATEMENT_SPARSE_SWITCH"), root_1);
+				// smaliParser.g:1126:8: ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* )
+				{
+				CommonTree root_2 = (CommonTree)adaptor.nil();
+				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SPARSE_SWITCH_ELEMENTS, (retval.start), "I_SPARSE_SWITCH_ELEMENTS"), root_2);
+				// smaliParser.g:1126:71: ( fixed_32bit_literal label_ref )*
+				while ( stream_fixed_32bit_literal.hasNext()||stream_label_ref.hasNext() ) {
+					adaptor.addChild(root_2, stream_fixed_32bit_literal.nextTree());
+					adaptor.addChild(root_2, stream_label_ref.nextTree());
+				}
+				stream_fixed_32bit_literal.reset();
+				stream_label_ref.reset();
+
+				adaptor.addChild(root_1, root_2);
+				}
+
+				adaptor.addChild(root_0, root_1);
+				}
+
+			}
+
+
+			retval.tree = root_0;
+
+			}
+
+			retval.stop = input.LT(-1);
+
+			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
+			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "insn_sparse_switch_directive"
+
+	// Delegated rules
+
+
+	protected DFA30 dfa30 = new DFA30(this);
+	protected DFA38 dfa38 = new DFA38(this);
+	protected DFA40 dfa40 = new DFA40(this);
+	static final String DFA30_eotS =
+		"\55\uffff";
+	static final String DFA30_eofS =
+		"\55\uffff";
+	static final String DFA30_minS =
+		"\1\4\52\23\2\uffff";
+	static final String DFA30_maxS =
+		"\1\u00c6\12\u00b4\1\u00b7\37\u00b4\2\uffff";
+	static final String DFA30_acceptS =
+		"\53\uffff\1\1\1\2";
+	static final String DFA30_specialS =
+		"\55\uffff}>";
+	static final String[] DFA30_transitionS = {
+			"\1\2\1\uffff\1\16\3\uffff\1\10\14\uffff\1\7\17\uffff\1\6\2\uffff\1\17"+
+			"\1\20\1\21\1\uffff\1\22\1\uffff\1\23\2\uffff\1\24\1\25\1\26\1\27\3\uffff"+
+			"\1\30\1\uffff\1\31\1\32\1\33\1\34\1\uffff\1\35\1\36\1\uffff\1\37\3\uffff"+
+			"\1\40\1\41\1\uffff\1\42\1\43\1\44\1\45\1\46\5\uffff\1\47\1\50\1\51\127"+
+			"\uffff\1\52\1\uffff\1\5\1\11\4\uffff\1\13\1\4\1\14\1\uffff\1\12\3\uffff"+
+			"\1\1\5\uffff\1\3\1\15",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54\2\uffff\1\13",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"\1\53\u00a0\uffff\1\54",
+			"",
+			""
+	};
+
+	static final short[] DFA30_eot = DFA.unpackEncodedString(DFA30_eotS);
+	static final short[] DFA30_eof = DFA.unpackEncodedString(DFA30_eofS);
+	static final char[] DFA30_min = DFA.unpackEncodedStringToUnsignedChars(DFA30_minS);
+	static final char[] DFA30_max = DFA.unpackEncodedStringToUnsignedChars(DFA30_maxS);
+	static final short[] DFA30_accept = DFA.unpackEncodedString(DFA30_acceptS);
+	static final short[] DFA30_special = DFA.unpackEncodedString(DFA30_specialS);
+	static final short[][] DFA30_transition;
+
+	static {
+		int numStates = DFA30_transitionS.length;
+		DFA30_transition = new short[numStates][];
+		for (int i=0; i<numStates; i++) {
+			DFA30_transition[i] = DFA.unpackEncodedString(DFA30_transitionS[i]);
+		}
+	}
+
+	protected class DFA30 extends DFA {
+
+		public DFA30(BaseRecognizer recognizer) {
+			this.recognizer = recognizer;
+			this.decisionNumber = 30;
+			this.eot = DFA30_eot;
+			this.eof = DFA30_eof;
+			this.min = DFA30_min;
+			this.max = DFA30_max;
+			this.accept = DFA30_accept;
+			this.special = DFA30_special;
+			this.transition = DFA30_transition;
+		}
+		@Override
+		public String getDescription() {
+			return "695:7: ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) )";
+		}
+	}
+
+	static final String DFA38_eotS =
+		"\62\uffff";
+	static final String DFA38_eofS =
+		"\62\uffff";
+	static final String DFA38_minS =
+		"\1\4\1\5\1\17\52\23\1\uffff\1\4\1\11\2\uffff";
+	static final String DFA38_maxS =
+		"\1\u00c6\1\u00c1\1\u00b9\12\u00b4\1\u00b7\37\u00b4\1\uffff\1\u00c6\1\11"+
+		"\2\uffff";
+	static final String DFA38_acceptS =
+		"\55\uffff\1\1\2\uffff\1\2\1\3";
+	static final String DFA38_specialS =
+		"\62\uffff}>";
+	static final String[] DFA38_transitionS = {
+			"\1\4\1\uffff\1\20\1\uffff\1\2\1\uffff\1\12\4\uffff\1\1\7\uffff\1\11\17"+
+			"\uffff\1\10\2\uffff\1\21\1\22\1\23\1\uffff\1\24\1\uffff\1\25\2\uffff"+
+			"\1\26\1\27\1\30\1\31\3\uffff\1\32\1\uffff\1\33\1\34\1\35\1\36\1\uffff"+
+			"\1\37\1\40\1\uffff\1\41\3\uffff\1\42\1\43\1\uffff\1\44\1\45\1\46\1\47"+
+			"\1\50\5\uffff\1\51\1\52\1\53\127\uffff\1\54\1\uffff\1\7\1\13\4\uffff"+
+			"\1\15\1\6\1\16\1\uffff\1\14\3\uffff\1\3\5\uffff\1\5\1\17",
+			"\1\55\1\uffff\1\55\1\uffff\1\56\2\uffff\2\55\5\uffff\1\55\7\uffff\2"+
+			"\55\5\uffff\1\55\7\uffff\56\55\123\uffff\3\55\7\uffff\2\55\3\uffff\1"+
+			"\55\1\uffff\2\55\2\uffff\2\55",
+			"\1\57\u00a9\uffff\1\57",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61\2\uffff\1\15",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"\1\60\u00a0\uffff\1\61",
+			"",
+			"\1\4\1\uffff\1\20\3\uffff\1\12\14\uffff\1\11\17\uffff\1\10\2\uffff\1"+
+			"\21\1\22\1\23\1\uffff\1\24\1\uffff\1\25\2\uffff\1\26\1\27\1\30\1\31\3"+
+			"\uffff\1\32\1\uffff\1\33\1\34\1\35\1\36\1\uffff\1\37\1\40\1\uffff\1\41"+
+			"\3\uffff\1\42\1\43\1\uffff\1\44\1\45\1\46\1\47\1\50\5\uffff\1\51\1\52"+
+			"\1\53\127\uffff\1\54\1\uffff\1\7\1\13\4\uffff\1\15\1\6\1\16\1\uffff\1"+
+			"\14\3\uffff\1\3\5\uffff\1\5\1\17",
+			"\1\56",
+			"",
+			""
+	};
+
+	static final short[] DFA38_eot = DFA.unpackEncodedString(DFA38_eotS);
+	static final short[] DFA38_eof = DFA.unpackEncodedString(DFA38_eofS);
+	static final char[] DFA38_min = DFA.unpackEncodedStringToUnsignedChars(DFA38_minS);
+	static final char[] DFA38_max = DFA.unpackEncodedStringToUnsignedChars(DFA38_maxS);
+	static final short[] DFA38_accept = DFA.unpackEncodedString(DFA38_acceptS);
+	static final short[] DFA38_special = DFA.unpackEncodedString(DFA38_specialS);
+	static final short[][] DFA38_transition;
+
+	static {
+		int numStates = DFA38_transitionS.length;
+		DFA38_transition = new short[numStates][];
+		for (int i=0; i<numStates; i++) {
+			DFA38_transition[i] = DFA.unpackEncodedString(DFA38_transitionS[i]);
+		}
+	}
+
+	protected class DFA38 extends DFA {
+
+		public DFA38(BaseRecognizer recognizer) {
+			this.recognizer = recognizer;
+			this.decisionNumber = 38;
+			this.eot = DFA38_eot;
+			this.eof = DFA38_eof;
+			this.min = DFA38_min;
+			this.max = DFA38_max;
+			this.accept = DFA38_accept;
+			this.special = DFA38_special;
+			this.transition = DFA38_transition;
+		}
+		@Override
+		public String getDescription() {
+			return "723:1: verification_error_reference : ( CLASS_DESCRIPTOR | field_reference | method_reference );";
+		}
+	}
+
+	static final String DFA40_eotS =
+		"\103\uffff";
+	static final String DFA40_eofS =
+		"\103\uffff";
+	static final String DFA40_minS =
+		"\1\5\100\uffff\1\0\1\uffff";
+	static final String DFA40_maxS =
+		"\1\u00c1\100\uffff\1\0\1\uffff";
+	static final String DFA40_acceptS =
+		"\1\uffff\1\2\100\uffff\1\1";
+	static final String DFA40_specialS =
+		"\101\uffff\1\0\1\uffff}>";
+	static final String[] DFA40_transitionS = {
+			"\1\101\1\uffff\1\1\4\uffff\2\1\5\uffff\1\1\7\uffff\2\1\1\uffff\1\1\3"+
+			"\uffff\1\1\7\uffff\56\1\123\uffff\3\1\7\uffff\2\1\3\uffff\1\1\1\uffff"+
+			"\2\1\2\uffff\2\1",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"",
+			"\1\uffff",
+			""
+	};
+
+	static final short[] DFA40_eot = DFA.unpackEncodedString(DFA40_eotS);
+	static final short[] DFA40_eof = DFA.unpackEncodedString(DFA40_eofS);
+	static final char[] DFA40_min = DFA.unpackEncodedStringToUnsignedChars(DFA40_minS);
+	static final char[] DFA40_max = DFA.unpackEncodedStringToUnsignedChars(DFA40_maxS);
+	static final short[] DFA40_accept = DFA.unpackEncodedString(DFA40_acceptS);
+	static final short[] DFA40_special = DFA.unpackEncodedString(DFA40_specialS);
+	static final short[][] DFA40_transition;
+
+	static {
+		int numStates = DFA40_transitionS.length;
+		DFA40_transition = new short[numStates][];
+		for (int i=0; i<numStates; i++) {
+			DFA40_transition[i] = DFA.unpackEncodedString(DFA40_transitionS[i]);
+		}
+	}
+
+	protected class DFA40 extends DFA {
+
+		public DFA40(BaseRecognizer recognizer) {
+			this.recognizer = recognizer;
+			this.decisionNumber = 40;
+			this.eot = DFA40_eot;
+			this.eof = DFA40_eof;
+			this.min = DFA40_min;
+			this.max = DFA40_max;
+			this.accept = DFA40_accept;
+			this.special = DFA40_special;
+			this.transition = DFA40_transition;
+		}
+		@Override
+		public String getDescription() {
+			return "()* loopback of 741:5: ({...}? annotation )*";
+		}
+		@Override
+		public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+			TokenStream input = (TokenStream)_input;
+			int _s = s;
+			switch ( s ) {
+					case 0 : 
+						int LA40_65 = input.LA(1);
+						 
+						int index40_65 = input.index();
+						input.rewind();
+						s = -1;
+						if ( ((input.LA(1) == ANNOTATION_DIRECTIVE)) ) {s = 66;}
+						else if ( (true) ) {s = 1;}
+						 
+						input.seek(index40_65);
+						if ( s>=0 ) return s;
+						break;
+			}
+			NoViableAltException nvae =
+				new NoViableAltException(getDescription(), 40, _s, input);
+			error(nvae);
+			throw nvae;
+		}
+	}
+
+	public static final BitSet FOLLOW_class_spec_in_smali_file1075 = new BitSet(new long[]{0x0000011000010020L,0x0000000000000000L,0x0001000000000000L,0x0000000000000011L});
+	public static final BitSet FOLLOW_super_spec_in_smali_file1086 = new BitSet(new long[]{0x0000011000010020L,0x0000000000000000L,0x0001000000000000L,0x0000000000000011L});
+	public static final BitSet FOLLOW_implements_spec_in_smali_file1094 = new BitSet(new long[]{0x0000011000010020L,0x0000000000000000L,0x0001000000000000L,0x0000000000000011L});
+	public static final BitSet FOLLOW_source_spec_in_smali_file1103 = new BitSet(new long[]{0x0000011000010020L,0x0000000000000000L,0x0001000000000000L,0x0000000000000011L});
+	public static final BitSet FOLLOW_method_in_smali_file1111 = new BitSet(new long[]{0x0000011000010020L,0x0000000000000000L,0x0001000000000000L,0x0000000000000011L});
+	public static final BitSet FOLLOW_field_in_smali_file1117 = new BitSet(new long[]{0x0000011000010020L,0x0000000000000000L,0x0001000000000000L,0x0000000000000011L});
+	public static final BitSet FOLLOW_annotation_in_smali_file1123 = new BitSet(new long[]{0x0000011000010020L,0x0000000000000000L,0x0001000000000000L,0x0000000000000011L});
+	public static final BitSet FOLLOW_EOF_in_smali_file1134 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CLASS_DIRECTIVE_in_class_spec1221 = new BitSet(new long[]{0x0000000000008010L});
+	public static final BitSet FOLLOW_access_list_in_class_spec1223 = new BitSet(new long[]{0x0000000000008000L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_class_spec1225 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SUPER_DIRECTIVE_in_super_spec1243 = new BitSet(new long[]{0x0000000000008000L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_super_spec1245 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_IMPLEMENTS_DIRECTIVE_in_implements_spec1264 = new BitSet(new long[]{0x0000000000008000L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_implements_spec1266 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SOURCE_DIRECTIVE_in_source_spec1285 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_STRING_LITERAL_in_source_spec1287 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_ACCESS_SPEC_in_access_list1306 = new BitSet(new long[]{0x0000000000000012L});
+	public static final BitSet FOLLOW_FIELD_DIRECTIVE_in_field1337 = new BitSet(new long[]{0xF4795C8000800450L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_access_list_in_field1339 = new BitSet(new long[]{0xF4795C8000800450L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_member_name_in_field1341 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_COLON_in_field1343 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_field1345 = new BitSet(new long[]{0x0000000804000022L});
+	public static final BitSet FOLLOW_EQUAL_in_field1348 = new BitSet(new long[]{0xF4795CC200C0CD50L,0x0000000000E0FB16L,0xCB8EC00000000000L,0x000000000000006CL});
+	public static final BitSet FOLLOW_literal_in_field1350 = new BitSet(new long[]{0x0000000004000022L});
+	public static final BitSet FOLLOW_annotation_in_field1363 = new BitSet(new long[]{0x0000000004000022L});
+	public static final BitSet FOLLOW_END_FIELD_DIRECTIVE_in_field1377 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_METHOD_DIRECTIVE_in_method1488 = new BitSet(new long[]{0xF4795C8000800450L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_access_list_in_method1490 = new BitSet(new long[]{0xF4795C8000800450L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_member_name_in_method1492 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0010000000000000L});
+	public static final BitSet FOLLOW_method_prototype_in_method1494 = new BitSet(new long[]{0xFFFFFC04180830A0L,0x0000000000FFFFFFL,0x3460380000000000L,0x0000000000000003L});
+	public static final BitSet FOLLOW_statements_and_directives_in_method1496 = new BitSet(new long[]{0x0000000010000000L});
+	public static final BitSet FOLLOW_END_METHOD_DIRECTIVE_in_method1502 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_ordered_method_item_in_statements_and_directives1547 = new BitSet(new long[]{0xFFFFFC04080830A2L,0x0000000000FFFFFFL,0x3460380000000000L,0x0000000000000003L});
+	public static final BitSet FOLLOW_registers_directive_in_statements_and_directives1555 = new BitSet(new long[]{0xFFFFFC04080830A2L,0x0000000000FFFFFFL,0x3460380000000000L,0x0000000000000003L});
+	public static final BitSet FOLLOW_catch_directive_in_statements_and_directives1563 = new BitSet(new long[]{0xFFFFFC04080830A2L,0x0000000000FFFFFFL,0x3460380000000000L,0x0000000000000003L});
+	public static final BitSet FOLLOW_catchall_directive_in_statements_and_directives1571 = new BitSet(new long[]{0xFFFFFC04080830A2L,0x0000000000FFFFFFL,0x3460380000000000L,0x0000000000000003L});
+	public static final BitSet FOLLOW_parameter_directive_in_statements_and_directives1579 = new BitSet(new long[]{0xFFFFFC04080830A2L,0x0000000000FFFFFFL,0x3460380000000000L,0x0000000000000003L});
+	public static final BitSet FOLLOW_annotation_in_statements_and_directives1587 = new BitSet(new long[]{0xFFFFFC04080830A2L,0x0000000000FFFFFFL,0x3460380000000000L,0x0000000000000003L});
+	public static final BitSet FOLLOW_label_in_ordered_method_item1672 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_instruction_in_ordered_method_item1678 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_debug_directive_in_ordered_method_item1684 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_REGISTERS_DIRECTIVE_in_registers_directive1704 = new BitSet(new long[]{0x0000000000004800L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_integral_literal_in_registers_directive1708 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_LOCALS_DIRECTIVE_in_registers_directive1728 = new BitSet(new long[]{0x0000000000004800L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_integral_literal_in_registers_directive1732 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id1764 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0080000000000000L});
+	public static final BitSet FOLLOW_SIMPLE_NAME_in_simple_name1777 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_ACCESS_SPEC_in_simple_name1783 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_VERIFICATION_ERROR_TYPE_in_simple_name1794 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_POSITIVE_INTEGER_LITERAL_in_simple_name1805 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_NEGATIVE_INTEGER_LITERAL_in_simple_name1816 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_FLOAT_LITERAL_OR_ID_in_simple_name1827 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_DOUBLE_LITERAL_OR_ID_in_simple_name1838 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BOOL_LITERAL_in_simple_name1849 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_NULL_LITERAL_in_simple_name1860 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_REGISTER_in_simple_name1871 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_param_list_or_id_in_simple_name1882 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PRIMITIVE_TYPE_in_simple_name1892 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_VOID_TYPE_in_simple_name1903 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_ANNOTATION_VISIBILITY_in_simple_name1914 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT10t_in_simple_name1925 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT10x_in_simple_name1936 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_simple_name1947 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT11x_in_simple_name1958 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_simple_name1969 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_simple_name1980 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_simple_name1991 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_simple_name2002 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_simple_name2013 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21t_in_simple_name2024 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_simple_name2035 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_simple_name2046 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_simple_name2057 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_simple_name2068 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_simple_name2079 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22t_in_simple_name2090 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT23x_in_simple_name2101 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_simple_name2112 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT31t_in_simple_name2123 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_simple_name2134 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_simple_name2145 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_simple_name2156 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_simple_name2167 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_simple_name2178 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_simple_name2189 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_simple_name2200 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT51l_in_simple_name2211 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_simple_name_in_member_name2226 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_MEMBER_NAME_in_member_name2232 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_OPEN_PAREN_in_method_prototype2247 = new BitSet(new long[]{0x0000000000048100L,0x0000000000000000L,0x0280000000000000L});
+	public static final BitSet FOLLOW_param_list_in_method_prototype2249 = new BitSet(new long[]{0x0000000000040000L});
+	public static final BitSet FOLLOW_CLOSE_PAREN_in_method_prototype2251 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L,0x0000000000000040L});
+	public static final BitSet FOLLOW_type_descriptor_in_method_prototype2253 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id_primitive_type2283 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_param_list_or_id_primitive_type_in_param_list2298 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0080000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_param_list2305 = new BitSet(new long[]{0x0000000000008102L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor2316 = new BitSet(new long[]{0x0000000000008000L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_set_in_array_descriptor2318 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_VOID_TYPE_in_type_descriptor2334 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PRIMITIVE_TYPE_in_type_descriptor2340 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_type_descriptor2346 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_array_descriptor_in_type_descriptor2352 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor2362 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor2368 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_array_descriptor_in_nonvoid_type_descriptor2374 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor2384 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_array_descriptor_in_reference_type_descriptor2390 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_POSITIVE_INTEGER_LITERAL_in_integer_literal2400 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_NEGATIVE_INTEGER_LITERAL_in_integer_literal2411 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_FLOAT_LITERAL_OR_ID_in_float_literal2426 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_FLOAT_LITERAL_in_float_literal2437 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_DOUBLE_LITERAL_OR_ID_in_double_literal2447 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_DOUBLE_LITERAL_in_double_literal2458 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_LONG_LITERAL_in_literal2468 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_literal2474 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SHORT_LITERAL_in_literal2480 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BYTE_LITERAL_in_literal2486 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_float_literal_in_literal2492 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_double_literal_in_literal2498 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CHAR_LITERAL_in_literal2504 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_STRING_LITERAL_in_literal2510 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BOOL_LITERAL_in_literal2516 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_NULL_LITERAL_in_literal2522 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_array_literal_in_literal2528 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_subannotation_in_literal2534 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_type_field_method_literal_in_literal2540 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_enum_literal_in_literal2546 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_parsed_integer_literal2559 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_LONG_LITERAL_in_integral_literal2571 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_integral_literal2577 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SHORT_LITERAL_in_integral_literal2583 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CHAR_LITERAL_in_integral_literal2589 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BYTE_LITERAL_in_integral_literal2595 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_LONG_LITERAL_in_fixed_32bit_literal2605 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_fixed_32bit_literal2611 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SHORT_LITERAL_in_fixed_32bit_literal2617 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BYTE_LITERAL_in_fixed_32bit_literal2623 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_float_literal_in_fixed_32bit_literal2629 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CHAR_LITERAL_in_fixed_32bit_literal2635 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BOOL_LITERAL_in_fixed_32bit_literal2641 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_fixed_literal2651 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_LONG_LITERAL_in_fixed_literal2657 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SHORT_LITERAL_in_fixed_literal2663 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BYTE_LITERAL_in_fixed_literal2669 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_float_literal_in_fixed_literal2675 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_double_literal_in_fixed_literal2681 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CHAR_LITERAL_in_fixed_literal2687 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BOOL_LITERAL_in_fixed_literal2693 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_array_literal2703 = new BitSet(new long[]{0xF4795CC200C2CD50L,0x0000000000E0FB16L,0xCB8EC00000000000L,0x000000000000006CL});
+	public static final BitSet FOLLOW_literal_in_array_literal2706 = new BitSet(new long[]{0x0000000000120000L});
+	public static final BitSet FOLLOW_COMMA_in_array_literal2709 = new BitSet(new long[]{0xF4795CC200C0CD50L,0x0000000000E0FB16L,0xCB8EC00000000000L,0x000000000000006CL});
+	public static final BitSet FOLLOW_literal_in_array_literal2711 = new BitSet(new long[]{0x0000000000120000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_array_literal2719 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_simple_name_in_annotation_element2743 = new BitSet(new long[]{0x0000000800000000L});
+	public static final BitSet FOLLOW_EQUAL_in_annotation_element2745 = new BitSet(new long[]{0xF4795CC200C0CD50L,0x0000000000E0FB16L,0xCB8EC00000000000L,0x000000000000006CL});
+	public static final BitSet FOLLOW_literal_in_annotation_element2747 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_ANNOTATION_DIRECTIVE_in_annotation2772 = new BitSet(new long[]{0x0000000000000040L});
+	public static final BitSet FOLLOW_ANNOTATION_VISIBILITY_in_annotation2774 = new BitSet(new long[]{0x0000000000008000L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_annotation2776 = new BitSet(new long[]{0xF4795C8001800450L,0x0000000000E0FB16L,0x8B86000000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_annotation_element_in_annotation2782 = new BitSet(new long[]{0xF4795C8001800450L,0x0000000000E0FB16L,0x8B86000000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_END_ANNOTATION_DIRECTIVE_in_annotation2785 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SUBANNOTATION_DIRECTIVE_in_subannotation2818 = new BitSet(new long[]{0x0000000000008000L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_subannotation2820 = new BitSet(new long[]{0xF4795C8100800450L,0x0000000000E0FB16L,0x8B86000000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_annotation_element_in_subannotation2822 = new BitSet(new long[]{0xF4795C8100800450L,0x0000000000E0FB16L,0x8B86000000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_END_SUBANNOTATION_DIRECTIVE_in_subannotation2825 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_ENUM_DIRECTIVE_in_enum_literal2852 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_field_reference_in_enum_literal2854 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_reference_type_descriptor_in_type_field_method_literal2874 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_reference_type_descriptor_in_type_field_method_literal2883 = new BitSet(new long[]{0x0000000000000200L});
+	public static final BitSet FOLLOW_ARROW_in_type_field_method_literal2885 = new BitSet(new long[]{0xF4795C8000800450L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_member_name_in_type_field_method_literal2897 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_COLON_in_type_field_method_literal2899 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_type_field_method_literal2901 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_member_name_in_type_field_method_literal2924 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0010000000000000L});
+	public static final BitSet FOLLOW_method_prototype_in_type_field_method_literal2926 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PRIMITIVE_TYPE_in_type_field_method_literal2959 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_VOID_TYPE_in_type_field_method_literal2965 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_reference_type_descriptor_in_method_reference2976 = new BitSet(new long[]{0x0000000000000200L});
+	public static final BitSet FOLLOW_ARROW_in_method_reference2978 = new BitSet(new long[]{0xF4795C8000800450L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_member_name_in_method_reference2982 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0010000000000000L});
+	public static final BitSet FOLLOW_method_prototype_in_method_reference2984 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_reference_type_descriptor_in_field_reference3006 = new BitSet(new long[]{0x0000000000000200L});
+	public static final BitSet FOLLOW_ARROW_in_field_reference3008 = new BitSet(new long[]{0xF4795C8000800450L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_member_name_in_field_reference3012 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_COLON_in_field_reference3014 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_field_reference3016 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_COLON_in_label3037 = new BitSet(new long[]{0xF4795C8000800450L,0x0000000000E0FB16L,0x8B86000000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_simple_name_in_label3039 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_COLON_in_label_ref3058 = new BitSet(new long[]{0xF4795C8000800450L,0x0000000000E0FB16L,0x8B86000000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_simple_name_in_label_ref3060 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_REGISTER_in_register_list3074 = new BitSet(new long[]{0x0000000000100002L});
+	public static final BitSet FOLLOW_COMMA_in_register_list3077 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_register_list3079 = new BitSet(new long[]{0x0000000000100002L});
+	public static final BitSet FOLLOW_REGISTER_in_register_range3114 = new BitSet(new long[]{0x0000000000200002L});
+	public static final BitSet FOLLOW_DOTDOT_in_register_range3117 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_register_range3121 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference3150 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_field_reference_in_verification_error_reference3154 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_method_reference_in_verification_error_reference3158 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CATCH_DIRECTIVE_in_catch_directive3168 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_catch_directive3170 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_catch_directive3172 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_catch_directive3176 = new BitSet(new long[]{0x0000000000200000L});
+	public static final BitSet FOLLOW_DOTDOT_in_catch_directive3178 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_catch_directive3182 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_catch_directive3184 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_catch_directive3188 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CATCHALL_DIRECTIVE_in_catchall_directive3220 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_catchall_directive3222 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_catchall_directive3226 = new BitSet(new long[]{0x0000000000200000L});
+	public static final BitSet FOLLOW_DOTDOT_in_catchall_directive3228 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_catchall_directive3232 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_catchall_directive3234 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_catchall_directive3238 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PARAMETER_DIRECTIVE_in_parameter_directive3277 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_parameter_directive3279 = new BitSet(new long[]{0x0000000040100022L});
+	public static final BitSet FOLLOW_COMMA_in_parameter_directive3282 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_STRING_LITERAL_in_parameter_directive3284 = new BitSet(new long[]{0x0000000040000022L});
+	public static final BitSet FOLLOW_annotation_in_parameter_directive3295 = new BitSet(new long[]{0x0000000040000022L});
+	public static final BitSet FOLLOW_END_PARAMETER_DIRECTIVE_in_parameter_directive3308 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_line_directive_in_debug_directive3381 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_local_directive_in_debug_directive3387 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_end_local_directive_in_debug_directive3393 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_restart_local_directive_in_debug_directive3399 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_prologue_directive_in_debug_directive3405 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_epilogue_directive_in_debug_directive3411 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_source_directive_in_debug_directive3417 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_LINE_DIRECTIVE_in_line_directive3427 = new BitSet(new long[]{0x0000000000004800L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_integral_literal_in_line_directive3429 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_LOCAL_DIRECTIVE_in_local_directive3452 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_local_directive3454 = new BitSet(new long[]{0x0000000000100002L});
+	public static final BitSet FOLLOW_COMMA_in_local_directive3457 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0004000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_NULL_LITERAL_in_local_directive3460 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_STRING_LITERAL_in_local_directive3466 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_COLON_in_local_directive3469 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L,0x0000000000000040L});
+	public static final BitSet FOLLOW_VOID_TYPE_in_local_directive3472 = new BitSet(new long[]{0x0000000000100002L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_local_directive3476 = new BitSet(new long[]{0x0000000000100002L});
+	public static final BitSet FOLLOW_COMMA_in_local_directive3510 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_STRING_LITERAL_in_local_directive3514 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_END_LOCAL_DIRECTIVE_in_end_local_directive3556 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_end_local_directive3558 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_RESTART_LOCAL_DIRECTIVE_in_restart_local_directive3581 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_restart_local_directive3583 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PROLOGUE_DIRECTIVE_in_prologue_directive3606 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_EPILOGUE_DIRECTIVE_in_epilogue_directive3627 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SOURCE_DIRECTIVE_in_source_directive3648 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_STRING_LITERAL_in_source_directive3650 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT12x_in_instruction_format12x3675 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_instruction_format12x3681 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22s_in_instruction_format22s3696 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_instruction_format22s3702 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT31i_in_instruction_format31i3717 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_instruction_format31i3723 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format10t_in_instruction3740 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format10x_in_instruction3746 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format10x_odex_in_instruction3752 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format11n_in_instruction3758 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format11x_in_instruction3764 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format12x_in_instruction3770 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format20bc_in_instruction3776 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format20t_in_instruction3782 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21c_field_in_instruction3788 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21c_field_odex_in_instruction3794 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21c_string_in_instruction3800 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21c_type_in_instruction3806 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21ih_in_instruction3812 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21lh_in_instruction3818 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21s_in_instruction3824 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21t_in_instruction3830 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22b_in_instruction3836 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22c_field_in_instruction3842 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22c_field_odex_in_instruction3848 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22c_type_in_instruction3854 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22cs_field_in_instruction3860 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22s_in_instruction3866 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22t_in_instruction3872 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22x_in_instruction3878 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format23x_in_instruction3884 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format30t_in_instruction3890 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format31c_in_instruction3896 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format31i_in_instruction3902 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format31t_in_instruction3908 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format32x_in_instruction3914 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format35c_method_in_instruction3920 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format35c_type_in_instruction3926 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format35c_method_odex_in_instruction3932 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format35mi_method_in_instruction3938 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format35ms_method_in_instruction3944 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format3rc_method_in_instruction3950 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format3rc_method_odex_in_instruction3956 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format3rc_type_in_instruction3962 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format3rmi_method_in_instruction3968 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format3rms_method_in_instruction3974 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format45cc_method_in_instruction3980 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format4rcc_method_in_instruction3986 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format51l_in_instruction3992 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_array_data_directive_in_instruction3998 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_packed_switch_directive_in_instruction4004 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_sparse_switch_directive_in_instruction4010 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t4030 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format10t4032 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x4062 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_insn_format10x_odex4090 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n4111 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format11n4113 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format11n4115 = new BitSet(new long[]{0x0000000000004800L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_integral_literal_in_insn_format11n4117 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x4149 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format11x4151 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_instruction_format12x_in_insn_format12x4181 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format12x4183 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format12x4185 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format12x4187 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc4219 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+	public static final BitSet FOLLOW_VERIFICATION_ERROR_TYPE_in_insn_format20bc4221 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format20bc4223 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_verification_error_reference_in_insn_format20bc4225 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t4262 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format20t4264 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_insn_format21c_field4294 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21c_field4296 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format21c_field4298 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_field_reference_in_insn_format21c_field4300 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_insn_format21c_field_odex4332 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21c_field_odex4334 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format21c_field_odex4336 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_field_reference_in_insn_format21c_field_odex4338 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string4376 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21c_string4378 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format21c_string4380 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_STRING_LITERAL_in_insn_format21c_string4382 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type4414 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21c_type4416 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format21c_type4418 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_insn_format21c_type4420 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih4452 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21ih4454 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format21ih4456 = new BitSet(new long[]{0x000000C000004C00L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_fixed_32bit_literal_in_insn_format21ih4458 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh4490 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21lh4492 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format21lh4494 = new BitSet(new long[]{0x000000C000004C00L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_fixed_32bit_literal_in_insn_format21lh4496 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s4528 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21s4530 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format21s4532 = new BitSet(new long[]{0x0000000000004800L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_integral_literal_in_insn_format21s4534 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t4566 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21t4568 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format21t4570 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format21t4572 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b4604 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22b4606 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22b4608 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22b4610 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22b4612 = new BitSet(new long[]{0x0000000000004800L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_integral_literal_in_insn_format22b4614 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_insn_format22c_field4648 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_field4650 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22c_field4652 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_field4654 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22c_field4656 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_field_reference_in_insn_format22c_field4658 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_insn_format22c_field_odex4692 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_field_odex4694 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22c_field_odex4696 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_field_odex4698 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22c_field_odex4700 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_field_reference_in_insn_format22c_field_odex4702 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type4742 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_type4744 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22c_type4746 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_type4748 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22c_type4750 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_insn_format22c_type4752 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_insn_format22cs_field4786 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22cs_field4788 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22cs_field4790 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22cs_field4792 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22cs_field4794 = new BitSet(new long[]{0x0000002000000000L});
+	public static final BitSet FOLLOW_FIELD_OFFSET_in_insn_format22cs_field4796 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_instruction_format22s_in_insn_format22s4817 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22s4819 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22s4821 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22s4823 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22s4825 = new BitSet(new long[]{0x0000000000004800L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_integral_literal_in_insn_format22s4827 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t4861 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22t4863 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22t4865 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22t4867 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22t4869 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format22t4871 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x4905 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22x4907 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format22x4909 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22x4911 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x4943 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format23x4945 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format23x4947 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format23x4949 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format23x4951 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format23x4953 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t4987 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format30t4989 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c5019 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format31c5021 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format31c5023 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_STRING_LITERAL_in_insn_format31c5025 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_instruction_format31i_in_insn_format31i5056 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format31i5058 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format31i5060 = new BitSet(new long[]{0x000000C000004C00L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_fixed_32bit_literal_in_insn_format31i5062 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t5094 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format31t5096 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format31t5098 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format31t5100 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x5132 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format32x5134 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format32x5136 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format32x5138 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method5170 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format35c_method5172 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format35c_method5174 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format35c_method5176 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format35c_method5178 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format35c_method5180 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type5212 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format35c_type5214 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format35c_type5216 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format35c_type5218 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format35c_type5220 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_insn_format35c_type5222 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_insn_format35c_method_odex5254 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format35c_method_odex5256 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format35c_method_odex5258 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format35c_method_odex5260 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format35c_method_odex5262 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format35c_method_odex5264 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_insn_format35mi_method5285 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format35mi_method5287 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format35mi_method5289 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format35mi_method5291 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format35mi_method5293 = new BitSet(new long[]{0x0000020000000000L});
+	public static final BitSet FOLLOW_INLINE_INDEX_in_insn_format35mi_method5295 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_insn_format35ms_method5316 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format35ms_method5318 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format35ms_method5320 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format35ms_method5322 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format35ms_method5324 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+	public static final BitSet FOLLOW_VTABLE_INDEX_in_insn_format35ms_method5326 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method5347 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format3rc_method5349 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_range_in_insn_format3rc_method5351 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format3rc_method5353 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format3rc_method5355 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format3rc_method5357 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_ODEX_in_insn_format3rc_method_odex5389 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format3rc_method_odex5391 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format3rc_method_odex5393 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format3rc_method_odex5395 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format3rc_method_odex5397 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format3rc_method_odex5399 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type5420 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format3rc_type5422 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_range_in_insn_format3rc_type5424 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format3rc_type5426 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format3rc_type5428 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_insn_format3rc_type5430 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT3rmi_METHOD_in_insn_format3rmi_method5462 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format3rmi_method5464 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_range_in_insn_format3rmi_method5466 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format3rmi_method5468 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format3rmi_method5470 = new BitSet(new long[]{0x0000020000000000L});
+	public static final BitSet FOLLOW_INLINE_INDEX_in_insn_format3rmi_method5472 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT3rms_METHOD_in_insn_format3rms_method5493 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format3rms_method5495 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_range_in_insn_format3rms_method5497 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format3rms_method5499 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format3rms_method5501 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+	public static final BitSet FOLLOW_VTABLE_INDEX_in_insn_format3rms_method5503 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method5524 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format45cc_method5526 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format45cc_method5528 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format45cc_method5530 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format45cc_method5532 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format45cc_method5534 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format45cc_method5536 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0010000000000000L});
+	public static final BitSet FOLLOW_method_prototype_in_insn_format45cc_method5538 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method5572 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L});
+	public static final BitSet FOLLOW_OPEN_BRACE_in_insn_format4rcc_method5574 = new BitSet(new long[]{0x0000000000020000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_register_range_in_insn_format4rcc_method5576 = new BitSet(new long[]{0x0000000000020000L});
+	public static final BitSet FOLLOW_CLOSE_BRACE_in_insn_format4rcc_method5578 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format4rcc_method5580 = new BitSet(new long[]{0xF4795C8000808550L,0x0000000000E0FB16L,0x8B86800000000000L,0x0000000000000060L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format4rcc_method5582 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format4rcc_method5584 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0010000000000000L});
+	public static final BitSet FOLLOW_method_prototype_in_insn_format4rcc_method5586 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l5620 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format51l5622 = new BitSet(new long[]{0x0000000000100000L});
+	public static final BitSet FOLLOW_COMMA_in_insn_format51l5624 = new BitSet(new long[]{0x000000C000C04C00L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_fixed_literal_in_insn_format51l5626 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5653 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0102000000000000L});
+	public static final BitSet FOLLOW_parsed_integer_literal_in_insn_array_data_directive5659 = new BitSet(new long[]{0x000000C002C04C00L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_fixed_literal_in_insn_array_data_directive5671 = new BitSet(new long[]{0x000000C002C04C00L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_END_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5674 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5720 = new BitSet(new long[]{0x000000C000004C00L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_fixed_32bit_literal_in_insn_packed_switch_directive5726 = new BitSet(new long[]{0x0000000020080000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_packed_switch_directive5732 = new BitSet(new long[]{0x0000000020080000L});
+	public static final BitSet FOLLOW_END_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5739 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5813 = new BitSet(new long[]{0x000000C080004C00L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_fixed_32bit_literal_in_insn_sparse_switch_directive5820 = new BitSet(new long[]{0x0000000000000200L});
+	public static final BitSet FOLLOW_ARROW_in_insn_sparse_switch_directive5822 = new BitSet(new long[]{0x0000000000080000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_sparse_switch_directive5824 = new BitSet(new long[]{0x000000C080004C00L,0x0000000000000000L,0x4102400000000000L});
+	public static final BitSet FOLLOW_END_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5832 = new BitSet(new long[]{0x0000000000000002L});
+}
diff --git a/smali/src/main/java/org/jf/smali/smaliTreeWalker.java b/smali/src/main/java/org/jf/smali/smaliTreeWalker.java
new file mode 100644
index 0000000..30b93c4
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/smaliTreeWalker.java
@@ -0,0 +1,7766 @@
+// $ANTLR 3.5.2 smaliTreeWalker.g 2017-04-20 15:20:46
+
+package org.jf.smali;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.antlr.runtime.BitSet;
+import org.antlr.runtime.*;
+import org.antlr.runtime.tree.CommonTree;
+import org.antlr.runtime.tree.TreeNodeStream;
+import org.antlr.runtime.tree.TreeParser;
+import org.antlr.runtime.tree.TreeRuleReturnScope;
+import org.jf.dexlib2.*;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.builder.MethodImplementationBuilder;
+import org.jf.dexlib2.builder.SwitchLabelElement;
+import org.jf.dexlib2.builder.instruction.*;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.immutable.ImmutableAnnotation;
+import org.jf.dexlib2.immutable.ImmutableAnnotationElement;
+import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodProtoReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableTypeReference;
+import org.jf.dexlib2.immutable.value.*;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.dexlib2.writer.InstructionFactory;
+import org.jf.dexlib2.writer.builder.*;
+import org.jf.util.LinearSearch;
+
+import java.util.*;
+
+
+import org.antlr.runtime.*;
+import org.antlr.runtime.tree.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class smaliTreeWalker extends TreeParser {
+	public static final String[] tokenNames = new String[] {
+		"<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE", 
+		"ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX", 
+		"ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE", 
+		"CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE", 
+		"CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID", 
+		"END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE", 
+		"END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE", 
+		"END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE", 
+		"ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET", 
+		"FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX", 
+		"INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX", 
+		"INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x", 
+		"INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t", 
+		"INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING", 
+		"INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh", 
+		"INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b", 
+		"INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE", 
+		"INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID", 
+		"INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x", 
+		"INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i", 
+		"INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x", 
+		"INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE", 
+		"INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD", 
+		"INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD", 
+		"INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD", 
+		"INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST", 
+		"I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS", 
+		"I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF", 
+		"I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD", 
+		"I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE", 
+		"I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS", 
+		"I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE", 
+		"I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY", 
+		"I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE", 
+		"I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL", 
+		"I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t", 
+		"I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x", 
+		"I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t", 
+		"I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE", 
+		"I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s", 
+		"I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD", 
+		"I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t", 
+		"I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t", 
+		"I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t", 
+		"I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE", 
+		"I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD", 
+		"I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH", 
+		"I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT", 
+		"LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL", 
+		"MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL", 
+		"OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE", 
+		"PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE", 
+		"PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE", 
+		"SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE", 
+		"STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE", 
+		"VOID_TYPE", "VTABLE_INDEX", "WHITE_SPACE"
+	};
+	public static final int EOF=-1;
+	public static final int ACCESS_SPEC=4;
+	public static final int ANNOTATION_DIRECTIVE=5;
+	public static final int ANNOTATION_VISIBILITY=6;
+	public static final int ARRAY_DATA_DIRECTIVE=7;
+	public static final int ARRAY_TYPE_PREFIX=8;
+	public static final int ARROW=9;
+	public static final int BOOL_LITERAL=10;
+	public static final int BYTE_LITERAL=11;
+	public static final int CATCHALL_DIRECTIVE=12;
+	public static final int CATCH_DIRECTIVE=13;
+	public static final int CHAR_LITERAL=14;
+	public static final int CLASS_DESCRIPTOR=15;
+	public static final int CLASS_DIRECTIVE=16;
+	public static final int CLOSE_BRACE=17;
+	public static final int CLOSE_PAREN=18;
+	public static final int COLON=19;
+	public static final int COMMA=20;
+	public static final int DOTDOT=21;
+	public static final int DOUBLE_LITERAL=22;
+	public static final int DOUBLE_LITERAL_OR_ID=23;
+	public static final int END_ANNOTATION_DIRECTIVE=24;
+	public static final int END_ARRAY_DATA_DIRECTIVE=25;
+	public static final int END_FIELD_DIRECTIVE=26;
+	public static final int END_LOCAL_DIRECTIVE=27;
+	public static final int END_METHOD_DIRECTIVE=28;
+	public static final int END_PACKED_SWITCH_DIRECTIVE=29;
+	public static final int END_PARAMETER_DIRECTIVE=30;
+	public static final int END_SPARSE_SWITCH_DIRECTIVE=31;
+	public static final int END_SUBANNOTATION_DIRECTIVE=32;
+	public static final int ENUM_DIRECTIVE=33;
+	public static final int EPILOGUE_DIRECTIVE=34;
+	public static final int EQUAL=35;
+	public static final int FIELD_DIRECTIVE=36;
+	public static final int FIELD_OFFSET=37;
+	public static final int FLOAT_LITERAL=38;
+	public static final int FLOAT_LITERAL_OR_ID=39;
+	public static final int IMPLEMENTS_DIRECTIVE=40;
+	public static final int INLINE_INDEX=41;
+	public static final int INSTRUCTION_FORMAT10t=42;
+	public static final int INSTRUCTION_FORMAT10x=43;
+	public static final int INSTRUCTION_FORMAT10x_ODEX=44;
+	public static final int INSTRUCTION_FORMAT11n=45;
+	public static final int INSTRUCTION_FORMAT11x=46;
+	public static final int INSTRUCTION_FORMAT12x=47;
+	public static final int INSTRUCTION_FORMAT12x_OR_ID=48;
+	public static final int INSTRUCTION_FORMAT20bc=49;
+	public static final int INSTRUCTION_FORMAT20t=50;
+	public static final int INSTRUCTION_FORMAT21c_FIELD=51;
+	public static final int INSTRUCTION_FORMAT21c_FIELD_ODEX=52;
+	public static final int INSTRUCTION_FORMAT21c_STRING=53;
+	public static final int INSTRUCTION_FORMAT21c_TYPE=54;
+	public static final int INSTRUCTION_FORMAT21ih=55;
+	public static final int INSTRUCTION_FORMAT21lh=56;
+	public static final int INSTRUCTION_FORMAT21s=57;
+	public static final int INSTRUCTION_FORMAT21t=58;
+	public static final int INSTRUCTION_FORMAT22b=59;
+	public static final int INSTRUCTION_FORMAT22c_FIELD=60;
+	public static final int INSTRUCTION_FORMAT22c_FIELD_ODEX=61;
+	public static final int INSTRUCTION_FORMAT22c_TYPE=62;
+	public static final int INSTRUCTION_FORMAT22cs_FIELD=63;
+	public static final int INSTRUCTION_FORMAT22s=64;
+	public static final int INSTRUCTION_FORMAT22s_OR_ID=65;
+	public static final int INSTRUCTION_FORMAT22t=66;
+	public static final int INSTRUCTION_FORMAT22x=67;
+	public static final int INSTRUCTION_FORMAT23x=68;
+	public static final int INSTRUCTION_FORMAT30t=69;
+	public static final int INSTRUCTION_FORMAT31c=70;
+	public static final int INSTRUCTION_FORMAT31i=71;
+	public static final int INSTRUCTION_FORMAT31i_OR_ID=72;
+	public static final int INSTRUCTION_FORMAT31t=73;
+	public static final int INSTRUCTION_FORMAT32x=74;
+	public static final int INSTRUCTION_FORMAT35c_METHOD=75;
+	public static final int INSTRUCTION_FORMAT35c_METHOD_ODEX=76;
+	public static final int INSTRUCTION_FORMAT35c_TYPE=77;
+	public static final int INSTRUCTION_FORMAT35mi_METHOD=78;
+	public static final int INSTRUCTION_FORMAT35ms_METHOD=79;
+	public static final int INSTRUCTION_FORMAT3rc_METHOD=80;
+	public static final int INSTRUCTION_FORMAT3rc_METHOD_ODEX=81;
+	public static final int INSTRUCTION_FORMAT3rc_TYPE=82;
+	public static final int INSTRUCTION_FORMAT3rmi_METHOD=83;
+	public static final int INSTRUCTION_FORMAT3rms_METHOD=84;
+	public static final int INSTRUCTION_FORMAT45cc_METHOD=85;
+	public static final int INSTRUCTION_FORMAT4rcc_METHOD=86;
+	public static final int INSTRUCTION_FORMAT51l=87;
+	public static final int INTEGER_LITERAL=88;
+	public static final int INVALID_TOKEN=89;
+	public static final int I_ACCESS_LIST=90;
+	public static final int I_ANNOTATION=91;
+	public static final int I_ANNOTATIONS=92;
+	public static final int I_ANNOTATION_ELEMENT=93;
+	public static final int I_ARRAY_ELEMENTS=94;
+	public static final int I_ARRAY_ELEMENT_SIZE=95;
+	public static final int I_CATCH=96;
+	public static final int I_CATCHALL=97;
+	public static final int I_CATCHES=98;
+	public static final int I_CLASS_DEF=99;
+	public static final int I_ENCODED_ARRAY=100;
+	public static final int I_ENCODED_ENUM=101;
+	public static final int I_ENCODED_FIELD=102;
+	public static final int I_ENCODED_METHOD=103;
+	public static final int I_END_LOCAL=104;
+	public static final int I_EPILOGUE=105;
+	public static final int I_FIELD=106;
+	public static final int I_FIELDS=107;
+	public static final int I_FIELD_INITIAL_VALUE=108;
+	public static final int I_FIELD_TYPE=109;
+	public static final int I_IMPLEMENTS=110;
+	public static final int I_LABEL=111;
+	public static final int I_LINE=112;
+	public static final int I_LOCAL=113;
+	public static final int I_LOCALS=114;
+	public static final int I_METHOD=115;
+	public static final int I_METHODS=116;
+	public static final int I_METHOD_PROTOTYPE=117;
+	public static final int I_METHOD_RETURN_TYPE=118;
+	public static final int I_ORDERED_METHOD_ITEMS=119;
+	public static final int I_PACKED_SWITCH_ELEMENTS=120;
+	public static final int I_PACKED_SWITCH_START_KEY=121;
+	public static final int I_PARAMETER=122;
+	public static final int I_PARAMETERS=123;
+	public static final int I_PARAMETER_NOT_SPECIFIED=124;
+	public static final int I_PROLOGUE=125;
+	public static final int I_REGISTERS=126;
+	public static final int I_REGISTER_LIST=127;
+	public static final int I_REGISTER_RANGE=128;
+	public static final int I_RESTART_LOCAL=129;
+	public static final int I_SOURCE=130;
+	public static final int I_SPARSE_SWITCH_ELEMENTS=131;
+	public static final int I_STATEMENT_ARRAY_DATA=132;
+	public static final int I_STATEMENT_FORMAT10t=133;
+	public static final int I_STATEMENT_FORMAT10x=134;
+	public static final int I_STATEMENT_FORMAT11n=135;
+	public static final int I_STATEMENT_FORMAT11x=136;
+	public static final int I_STATEMENT_FORMAT12x=137;
+	public static final int I_STATEMENT_FORMAT20bc=138;
+	public static final int I_STATEMENT_FORMAT20t=139;
+	public static final int I_STATEMENT_FORMAT21c_FIELD=140;
+	public static final int I_STATEMENT_FORMAT21c_STRING=141;
+	public static final int I_STATEMENT_FORMAT21c_TYPE=142;
+	public static final int I_STATEMENT_FORMAT21ih=143;
+	public static final int I_STATEMENT_FORMAT21lh=144;
+	public static final int I_STATEMENT_FORMAT21s=145;
+	public static final int I_STATEMENT_FORMAT21t=146;
+	public static final int I_STATEMENT_FORMAT22b=147;
+	public static final int I_STATEMENT_FORMAT22c_FIELD=148;
+	public static final int I_STATEMENT_FORMAT22c_TYPE=149;
+	public static final int I_STATEMENT_FORMAT22s=150;
+	public static final int I_STATEMENT_FORMAT22t=151;
+	public static final int I_STATEMENT_FORMAT22x=152;
+	public static final int I_STATEMENT_FORMAT23x=153;
+	public static final int I_STATEMENT_FORMAT30t=154;
+	public static final int I_STATEMENT_FORMAT31c=155;
+	public static final int I_STATEMENT_FORMAT31i=156;
+	public static final int I_STATEMENT_FORMAT31t=157;
+	public static final int I_STATEMENT_FORMAT32x=158;
+	public static final int I_STATEMENT_FORMAT35c_METHOD=159;
+	public static final int I_STATEMENT_FORMAT35c_TYPE=160;
+	public static final int I_STATEMENT_FORMAT3rc_METHOD=161;
+	public static final int I_STATEMENT_FORMAT3rc_TYPE=162;
+	public static final int I_STATEMENT_FORMAT45cc_METHOD=163;
+	public static final int I_STATEMENT_FORMAT4rcc_METHOD=164;
+	public static final int I_STATEMENT_FORMAT51l=165;
+	public static final int I_STATEMENT_PACKED_SWITCH=166;
+	public static final int I_STATEMENT_SPARSE_SWITCH=167;
+	public static final int I_SUBANNOTATION=168;
+	public static final int I_SUPER=169;
+	public static final int LINE_COMMENT=170;
+	public static final int LINE_DIRECTIVE=171;
+	public static final int LOCALS_DIRECTIVE=172;
+	public static final int LOCAL_DIRECTIVE=173;
+	public static final int LONG_LITERAL=174;
+	public static final int MEMBER_NAME=175;
+	public static final int METHOD_DIRECTIVE=176;
+	public static final int NEGATIVE_INTEGER_LITERAL=177;
+	public static final int NULL_LITERAL=178;
+	public static final int OPEN_BRACE=179;
+	public static final int OPEN_PAREN=180;
+	public static final int PACKED_SWITCH_DIRECTIVE=181;
+	public static final int PARAMETER_DIRECTIVE=182;
+	public static final int PARAM_LIST_OR_ID_PRIMITIVE_TYPE=183;
+	public static final int POSITIVE_INTEGER_LITERAL=184;
+	public static final int PRIMITIVE_TYPE=185;
+	public static final int PROLOGUE_DIRECTIVE=186;
+	public static final int REGISTER=187;
+	public static final int REGISTERS_DIRECTIVE=188;
+	public static final int RESTART_LOCAL_DIRECTIVE=189;
+	public static final int SHORT_LITERAL=190;
+	public static final int SIMPLE_NAME=191;
+	public static final int SOURCE_DIRECTIVE=192;
+	public static final int SPARSE_SWITCH_DIRECTIVE=193;
+	public static final int STRING_LITERAL=194;
+	public static final int SUBANNOTATION_DIRECTIVE=195;
+	public static final int SUPER_DIRECTIVE=196;
+	public static final int VERIFICATION_ERROR_TYPE=197;
+	public static final int VOID_TYPE=198;
+	public static final int VTABLE_INDEX=199;
+	public static final int WHITE_SPACE=200;
+
+	// delegates
+	public TreeParser[] getDelegates() {
+		return new TreeParser[] {};
+	}
+
+	// delegators
+
+
+	public smaliTreeWalker(TreeNodeStream input) {
+		this(input, new RecognizerSharedState());
+	}
+	public smaliTreeWalker(TreeNodeStream input, RecognizerSharedState state) {
+		super(input, state);
+	}
+
+	@Override public String[] getTokenNames() { return smaliTreeWalker.tokenNames; }
+	@Override public String getGrammarFileName() { return "smaliTreeWalker.g"; }
+
+
+	  public String classType;
+	  private boolean verboseErrors = false;
+	  private int apiLevel = 15;
+	  private Opcodes opcodes = Opcodes.forApi(apiLevel);
+	  private DexBuilder dexBuilder;
+
+	  public void setDexBuilder(DexBuilder dexBuilder) {
+	      this.dexBuilder = dexBuilder;
+	  }
+
+	  public void setApiLevel(int apiLevel) {
+	      this.opcodes = Opcodes.forApi(apiLevel);
+	      this.apiLevel = apiLevel;
+	  }
+
+	  public void setVerboseErrors(boolean verboseErrors) {
+	    this.verboseErrors = verboseErrors;
+	  }
+
+	  private byte parseRegister_nibble(String register)
+	      throws SemanticException {
+	    int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
+	    int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
+
+	    //register should be in the format "v12"
+	    int val = Byte.parseByte(register.substring(1));
+	    if (register.charAt(0) == 'p') {
+	      val = totalMethodRegisters - methodParameterRegisters + val;
+	    }
+	    if (val >= 2<<4) {
+	      throw new SemanticException(input, "The maximum allowed register in this context is list of registers is v15");
+	    }
+	    //the parser wouldn't have accepted a negative register, i.e. v-1, so we don't have to check for val<0;
+	    return (byte)val;
+	  }
+
+	  //return a short, because java's byte is signed
+	  private short parseRegister_byte(String register)
+	      throws SemanticException {
+	    int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
+	    int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
+	    //register should be in the format "v123"
+	    int val = Short.parseShort(register.substring(1));
+	    if (register.charAt(0) == 'p') {
+	      val = totalMethodRegisters - methodParameterRegisters + val;
+	    }
+	    if (val >= 2<<8) {
+	      throw new SemanticException(input, "The maximum allowed register in this context is v255");
+	    }
+	    return (short)val;
+	  }
+
+	  //return an int because java's short is signed
+	  private int parseRegister_short(String register)
+	      throws SemanticException {
+	    int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
+	    int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
+	    //register should be in the format "v12345"
+	    int val = Integer.parseInt(register.substring(1));
+	    if (register.charAt(0) == 'p') {
+	      val = totalMethodRegisters - methodParameterRegisters + val;
+	    }
+	    if (val >= 2<<16) {
+	      throw new SemanticException(input, "The maximum allowed register in this context is v65535");
+	    }
+	    //the parser wouldn't accept a negative register, i.e. v-1, so we don't have to check for val<0;
+	    return val;
+	  }
+
+	  public String getErrorMessage(RecognitionException e, String[] tokenNames) {
+	    if ( e instanceof SemanticException ) {
+	      return e.getMessage();
+	    } else {
+	      return super.getErrorMessage(e, tokenNames);
+	    }
+	  }
+
+	  public String getErrorHeader(RecognitionException e) {
+	    return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]";
+	  }
+
+
+
+	// $ANTLR start "smali_file"
+	// smaliTreeWalker.g:160:1: smali_file returns [ClassDef classDef] : ^( I_CLASS_DEF header methods fields annotations ) ;
+	public final ClassDef smali_file() throws RecognitionException {
+		ClassDef classDef = null;
+
+
+		TreeRuleReturnScope header1 =null;
+		Set<Annotation> annotations2 =null;
+		List<BuilderField> fields3 =null;
+		List<BuilderMethod> methods4 =null;
+
+		try {
+			// smaliTreeWalker.g:161:3: ( ^( I_CLASS_DEF header methods fields annotations ) )
+			// smaliTreeWalker.g:161:5: ^( I_CLASS_DEF header methods fields annotations )
+			{
+			match(input,I_CLASS_DEF,FOLLOW_I_CLASS_DEF_in_smali_file52); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_header_in_smali_file54);
+			header1=header();
+			state._fsp--;
+
+			pushFollow(FOLLOW_methods_in_smali_file56);
+			methods4=methods();
+			state._fsp--;
+
+			pushFollow(FOLLOW_fields_in_smali_file58);
+			fields3=fields();
+			state._fsp--;
+
+			pushFollow(FOLLOW_annotations_in_smali_file60);
+			annotations2=annotations();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			    classDef = dexBuilder.internClassDef((header1!=null?((smaliTreeWalker.header_return)header1).classType:null), (header1!=null?((smaliTreeWalker.header_return)header1).accessFlags:0), (header1!=null?((smaliTreeWalker.header_return)header1).superType:null),
+			            (header1!=null?((smaliTreeWalker.header_return)header1).implementsList:null), (header1!=null?((smaliTreeWalker.header_return)header1).sourceSpec:null), annotations2, fields3, methods4);
+			  
+			}
+
+		}
+		catch (Exception ex) {
+
+			    if (verboseErrors) {
+			      ex.printStackTrace(System.err);
+			    }
+			    reportError(new SemanticException(input, ex));
+			  
+		}
+
+		finally {
+			// do for sure before leaving
+		}
+		return classDef;
+	}
+	// $ANTLR end "smali_file"
+
+
+	public static class header_return extends TreeRuleReturnScope {
+		public String classType;
+		public int accessFlags;
+		public String superType;
+		public List<String> implementsList;
+		public String sourceSpec;
+	};
+
+
+	// $ANTLR start "header"
+	// smaliTreeWalker.g:174:1: header returns [String classType, int accessFlags, String superType, List<String> implementsList, String sourceSpec] : class_spec ( super_spec )? implements_list source_spec ;
+	public final smaliTreeWalker.header_return header() throws RecognitionException {
+		smaliTreeWalker.header_return retval = new smaliTreeWalker.header_return();
+		retval.start = input.LT(1);
+
+		TreeRuleReturnScope class_spec5 =null;
+		String super_spec6 =null;
+		List<String> implements_list7 =null;
+		String source_spec8 =null;
+
+		try {
+			// smaliTreeWalker.g:175:3: ( class_spec ( super_spec )? implements_list source_spec )
+			// smaliTreeWalker.g:175:3: class_spec ( super_spec )? implements_list source_spec
+			{
+			pushFollow(FOLLOW_class_spec_in_header85);
+			class_spec5=class_spec();
+			state._fsp--;
+
+			// smaliTreeWalker.g:175:14: ( super_spec )?
+			int alt1=2;
+			int LA1_0 = input.LA(1);
+			if ( (LA1_0==I_SUPER) ) {
+				alt1=1;
+			}
+			switch (alt1) {
+				case 1 :
+					// smaliTreeWalker.g:175:14: super_spec
+					{
+					pushFollow(FOLLOW_super_spec_in_header87);
+					super_spec6=super_spec();
+					state._fsp--;
+
+					}
+					break;
+
+			}
+
+			pushFollow(FOLLOW_implements_list_in_header90);
+			implements_list7=implements_list();
+			state._fsp--;
+
+			pushFollow(FOLLOW_source_spec_in_header92);
+			source_spec8=source_spec();
+			state._fsp--;
+
+
+			    classType = (class_spec5!=null?((smaliTreeWalker.class_spec_return)class_spec5).type:null);
+			    retval.classType = classType;
+			    retval.accessFlags = (class_spec5!=null?((smaliTreeWalker.class_spec_return)class_spec5).accessFlags:0);
+			    retval.superType = super_spec6;
+			    retval.implementsList = implements_list7;
+			    retval.sourceSpec = source_spec8;
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "header"
+
+
+	public static class class_spec_return extends TreeRuleReturnScope {
+		public String type;
+		public int accessFlags;
+	};
+
+
+	// $ANTLR start "class_spec"
+	// smaliTreeWalker.g:186:1: class_spec returns [String type, int accessFlags] : CLASS_DESCRIPTOR access_list ;
+	public final smaliTreeWalker.class_spec_return class_spec() throws RecognitionException {
+		smaliTreeWalker.class_spec_return retval = new smaliTreeWalker.class_spec_return();
+		retval.start = input.LT(1);
+
+		CommonTree CLASS_DESCRIPTOR9=null;
+		int access_list10 =0;
+
+		try {
+			// smaliTreeWalker.g:187:3: ( CLASS_DESCRIPTOR access_list )
+			// smaliTreeWalker.g:187:5: CLASS_DESCRIPTOR access_list
+			{
+			CLASS_DESCRIPTOR9=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec110); 
+			pushFollow(FOLLOW_access_list_in_class_spec112);
+			access_list10=access_list();
+			state._fsp--;
+
+
+			    retval.type = (CLASS_DESCRIPTOR9!=null?CLASS_DESCRIPTOR9.getText():null);
+			    retval.accessFlags = access_list10;
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "class_spec"
+
+
+
+	// $ANTLR start "super_spec"
+	// smaliTreeWalker.g:193:1: super_spec returns [String type] : ^( I_SUPER CLASS_DESCRIPTOR ) ;
+	public final String super_spec() throws RecognitionException {
+		String type = null;
+
+
+		CommonTree CLASS_DESCRIPTOR11=null;
+
+		try {
+			// smaliTreeWalker.g:194:3: ( ^( I_SUPER CLASS_DESCRIPTOR ) )
+			// smaliTreeWalker.g:194:5: ^( I_SUPER CLASS_DESCRIPTOR )
+			{
+			match(input,I_SUPER,FOLLOW_I_SUPER_in_super_spec130); 
+			match(input, Token.DOWN, null); 
+			CLASS_DESCRIPTOR11=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec132); 
+			match(input, Token.UP, null); 
+
+
+			    type = (CLASS_DESCRIPTOR11!=null?CLASS_DESCRIPTOR11.getText():null);
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return type;
+	}
+	// $ANTLR end "super_spec"
+
+
+
+	// $ANTLR start "implements_spec"
+	// smaliTreeWalker.g:200:1: implements_spec returns [String type] : ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) ;
+	public final String implements_spec() throws RecognitionException {
+		String type = null;
+
+
+		CommonTree CLASS_DESCRIPTOR12=null;
+
+		try {
+			// smaliTreeWalker.g:201:3: ( ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) )
+			// smaliTreeWalker.g:201:5: ^( I_IMPLEMENTS CLASS_DESCRIPTOR )
+			{
+			match(input,I_IMPLEMENTS,FOLLOW_I_IMPLEMENTS_in_implements_spec152); 
+			match(input, Token.DOWN, null); 
+			CLASS_DESCRIPTOR12=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec154); 
+			match(input, Token.UP, null); 
+
+
+			    type = (CLASS_DESCRIPTOR12!=null?CLASS_DESCRIPTOR12.getText():null);
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return type;
+	}
+	// $ANTLR end "implements_spec"
+
+
+
+	// $ANTLR start "implements_list"
+	// smaliTreeWalker.g:206:1: implements_list returns [List<String> implementsList] : ( implements_spec )* ;
+	public final List<String> implements_list() throws RecognitionException {
+		List<String> implementsList = null;
+
+
+		String implements_spec13 =null;
+
+		 List<String> typeList; 
+		try {
+			// smaliTreeWalker.g:208:3: ( ( implements_spec )* )
+			// smaliTreeWalker.g:208:5: ( implements_spec )*
+			{
+			typeList = Lists.newArrayList();
+			// smaliTreeWalker.g:209:5: ( implements_spec )*
+			loop2:
+			while (true) {
+				int alt2=2;
+				int LA2_0 = input.LA(1);
+				if ( (LA2_0==I_IMPLEMENTS) ) {
+					alt2=1;
+				}
+
+				switch (alt2) {
+				case 1 :
+					// smaliTreeWalker.g:209:6: implements_spec
+					{
+					pushFollow(FOLLOW_implements_spec_in_implements_list184);
+					implements_spec13=implements_spec();
+					state._fsp--;
+
+					typeList.add(implements_spec13);
+					}
+					break;
+
+				default :
+					break loop2;
+				}
+			}
+
+
+			    if (typeList.size() > 0) {
+			      implementsList = typeList;
+			    } else {
+			      implementsList = null;
+			    }
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return implementsList;
+	}
+	// $ANTLR end "implements_list"
+
+
+
+	// $ANTLR start "source_spec"
+	// smaliTreeWalker.g:218:1: source_spec returns [String source] : ( ^( I_SOURCE string_literal ) |);
+	public final String source_spec() throws RecognitionException {
+		String source = null;
+
+
+		String string_literal14 =null;
+
+		try {
+			// smaliTreeWalker.g:219:3: ( ^( I_SOURCE string_literal ) |)
+			int alt3=2;
+			int LA3_0 = input.LA(1);
+			if ( (LA3_0==I_SOURCE) ) {
+				alt3=1;
+			}
+			else if ( (LA3_0==I_METHODS) ) {
+				alt3=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 3, 0, input);
+				throw nvae;
+			}
+
+			switch (alt3) {
+				case 1 :
+					// smaliTreeWalker.g:219:5: ^( I_SOURCE string_literal )
+					{
+					source = null;
+					match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source_spec213); 
+					match(input, Token.DOWN, null); 
+					pushFollow(FOLLOW_string_literal_in_source_spec215);
+					string_literal14=string_literal();
+					state._fsp--;
+
+					source = string_literal14;
+					match(input, Token.UP, null); 
+
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:221:16: 
+					{
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return source;
+	}
+	// $ANTLR end "source_spec"
+
+
+
+	// $ANTLR start "access_list"
+	// smaliTreeWalker.g:223:1: access_list returns [int value] : ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) ;
+	public final int access_list() throws RecognitionException {
+		int value = 0;
+
+
+		CommonTree ACCESS_SPEC15=null;
+
+
+		    value = 0;
+		  
+		try {
+			// smaliTreeWalker.g:228:3: ( ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) )
+			// smaliTreeWalker.g:228:5: ^( I_ACCESS_LIST ( ACCESS_SPEC )* )
+			{
+			match(input,I_ACCESS_LIST,FOLLOW_I_ACCESS_LIST_in_access_list248); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:229:7: ( ACCESS_SPEC )*
+				loop4:
+				while (true) {
+					int alt4=2;
+					int LA4_0 = input.LA(1);
+					if ( (LA4_0==ACCESS_SPEC) ) {
+						alt4=1;
+					}
+
+					switch (alt4) {
+					case 1 :
+						// smaliTreeWalker.g:230:9: ACCESS_SPEC
+						{
+						ACCESS_SPEC15=(CommonTree)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list266); 
+
+						          value |= AccessFlags.getAccessFlag(ACCESS_SPEC15.getText()).getValue();
+						        
+						}
+						break;
+
+					default :
+						break loop4;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "access_list"
+
+
+
+	// $ANTLR start "fields"
+	// smaliTreeWalker.g:237:1: fields returns [List<BuilderField> fields] : ^( I_FIELDS ( field )* ) ;
+	public final List<BuilderField> fields() throws RecognitionException {
+		List<BuilderField> fields = null;
+
+
+		BuilderField field16 =null;
+
+		fields = Lists.newArrayList();
+		try {
+			// smaliTreeWalker.g:239:3: ( ^( I_FIELDS ( field )* ) )
+			// smaliTreeWalker.g:239:5: ^( I_FIELDS ( field )* )
+			{
+			match(input,I_FIELDS,FOLLOW_I_FIELDS_in_fields308); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:240:7: ( field )*
+				loop5:
+				while (true) {
+					int alt5=2;
+					int LA5_0 = input.LA(1);
+					if ( (LA5_0==I_FIELD) ) {
+						alt5=1;
+					}
+
+					switch (alt5) {
+					case 1 :
+						// smaliTreeWalker.g:240:8: field
+						{
+						pushFollow(FOLLOW_field_in_fields317);
+						field16=field();
+						state._fsp--;
+
+
+						        fields.add(field16);
+						      
+						}
+						break;
+
+					default :
+						break loop5;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return fields;
+	}
+	// $ANTLR end "fields"
+
+
+
+	// $ANTLR start "methods"
+	// smaliTreeWalker.g:245:1: methods returns [List<BuilderMethod> methods] : ^( I_METHODS ( method )* ) ;
+	public final List<BuilderMethod> methods() throws RecognitionException {
+		List<BuilderMethod> methods = null;
+
+
+		BuilderMethod method17 =null;
+
+		methods = Lists.newArrayList();
+		try {
+			// smaliTreeWalker.g:247:3: ( ^( I_METHODS ( method )* ) )
+			// smaliTreeWalker.g:247:5: ^( I_METHODS ( method )* )
+			{
+			match(input,I_METHODS,FOLLOW_I_METHODS_in_methods349); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:248:7: ( method )*
+				loop6:
+				while (true) {
+					int alt6=2;
+					int LA6_0 = input.LA(1);
+					if ( (LA6_0==I_METHOD) ) {
+						alt6=1;
+					}
+
+					switch (alt6) {
+					case 1 :
+						// smaliTreeWalker.g:248:8: method
+						{
+						pushFollow(FOLLOW_method_in_methods358);
+						method17=method();
+						state._fsp--;
+
+
+						        methods.add(method17);
+						      
+						}
+						break;
+
+					default :
+						break loop6;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return methods;
+	}
+	// $ANTLR end "methods"
+
+
+
+	// $ANTLR start "field"
+	// smaliTreeWalker.g:253:1: field returns [BuilderField field] : ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) ;
+	public final BuilderField field() throws RecognitionException {
+		BuilderField field = null;
+
+
+		CommonTree SIMPLE_NAME20=null;
+		int access_list18 =0;
+		EncodedValue field_initial_value19 =null;
+		TreeRuleReturnScope nonvoid_type_descriptor21 =null;
+		Set<Annotation> annotations22 =null;
+
+		try {
+			// smaliTreeWalker.g:254:3: ( ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) )
+			// smaliTreeWalker.g:254:4: ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? )
+			{
+			match(input,I_FIELD,FOLLOW_I_FIELD_in_field383); 
+			match(input, Token.DOWN, null); 
+			SIMPLE_NAME20=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field385); 
+			pushFollow(FOLLOW_access_list_in_field387);
+			access_list18=access_list();
+			state._fsp--;
+
+			match(input,I_FIELD_TYPE,FOLLOW_I_FIELD_TYPE_in_field390); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_field392);
+			nonvoid_type_descriptor21=nonvoid_type_descriptor();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+			pushFollow(FOLLOW_field_initial_value_in_field395);
+			field_initial_value19=field_initial_value();
+			state._fsp--;
+
+			// smaliTreeWalker.g:254:98: ( annotations )?
+			int alt7=2;
+			int LA7_0 = input.LA(1);
+			if ( (LA7_0==I_ANNOTATIONS) ) {
+				alt7=1;
+			}
+			switch (alt7) {
+				case 1 :
+					// smaliTreeWalker.g:254:98: annotations
+					{
+					pushFollow(FOLLOW_annotations_in_field397);
+					annotations22=annotations();
+					state._fsp--;
+
+					}
+					break;
+
+			}
+
+			match(input, Token.UP, null); 
+
+
+			    int accessFlags = access_list18;
+
+
+			    if (!AccessFlags.STATIC.isSet(accessFlags) && field_initial_value19 != null) {
+			        throw new SemanticException(input, "Initial field values can only be specified for static fields.");
+			    }
+
+			    field = dexBuilder.internField(classType, (SIMPLE_NAME20!=null?SIMPLE_NAME20.getText():null), (nonvoid_type_descriptor21!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor21).type:null), access_list18,
+			            field_initial_value19, annotations22);
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return field;
+	}
+	// $ANTLR end "field"
+
+
+
+	// $ANTLR start "field_initial_value"
+	// smaliTreeWalker.g:268:1: field_initial_value returns [EncodedValue encodedValue] : ( ^( I_FIELD_INITIAL_VALUE literal ) |);
+	public final EncodedValue field_initial_value() throws RecognitionException {
+		EncodedValue encodedValue = null;
+
+
+		EncodedValue literal23 =null;
+
+		try {
+			// smaliTreeWalker.g:269:3: ( ^( I_FIELD_INITIAL_VALUE literal ) |)
+			int alt8=2;
+			int LA8_0 = input.LA(1);
+			if ( (LA8_0==I_FIELD_INITIAL_VALUE) ) {
+				alt8=1;
+			}
+			else if ( (LA8_0==UP||LA8_0==I_ANNOTATIONS) ) {
+				alt8=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 8, 0, input);
+				throw nvae;
+			}
+
+			switch (alt8) {
+				case 1 :
+					// smaliTreeWalker.g:269:5: ^( I_FIELD_INITIAL_VALUE literal )
+					{
+					match(input,I_FIELD_INITIAL_VALUE,FOLLOW_I_FIELD_INITIAL_VALUE_in_field_initial_value418); 
+					match(input, Token.DOWN, null); 
+					pushFollow(FOLLOW_literal_in_field_initial_value420);
+					literal23=literal();
+					state._fsp--;
+
+					match(input, Token.UP, null); 
+
+					encodedValue = literal23;
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:270:16: 
+					{
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return encodedValue;
+	}
+	// $ANTLR end "field_initial_value"
+
+
+
+	// $ANTLR start "literal"
+	// smaliTreeWalker.g:272:1: literal returns [EncodedValue encodedValue] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal );
+	public final EncodedValue literal() throws RecognitionException {
+		EncodedValue encodedValue = null;
+
+
+		int integer_literal24 =0;
+		long long_literal25 =0;
+		short short_literal26 =0;
+		byte byte_literal27 =0;
+		float float_literal28 =0.0f;
+		double double_literal29 =0.0;
+		char char_literal30 =0;
+		String string_literal31 =null;
+		boolean bool_literal32 =false;
+		String type_descriptor33 =null;
+		List<EncodedValue> array_literal34 =null;
+		TreeRuleReturnScope subannotation35 =null;
+		FieldReference field_literal36 =null;
+		MethodReference method_literal37 =null;
+		FieldReference enum_literal38 =null;
+
+		try {
+			// smaliTreeWalker.g:273:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal )
+			int alt9=16;
+			switch ( input.LA(1) ) {
+			case INTEGER_LITERAL:
+				{
+				alt9=1;
+				}
+				break;
+			case LONG_LITERAL:
+				{
+				alt9=2;
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt9=3;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt9=4;
+				}
+				break;
+			case FLOAT_LITERAL:
+				{
+				alt9=5;
+				}
+				break;
+			case DOUBLE_LITERAL:
+				{
+				alt9=6;
+				}
+				break;
+			case CHAR_LITERAL:
+				{
+				alt9=7;
+				}
+				break;
+			case STRING_LITERAL:
+				{
+				alt9=8;
+				}
+				break;
+			case BOOL_LITERAL:
+				{
+				alt9=9;
+				}
+				break;
+			case NULL_LITERAL:
+				{
+				alt9=10;
+				}
+				break;
+			case ARRAY_TYPE_PREFIX:
+			case CLASS_DESCRIPTOR:
+			case PRIMITIVE_TYPE:
+			case VOID_TYPE:
+				{
+				alt9=11;
+				}
+				break;
+			case I_ENCODED_ARRAY:
+				{
+				alt9=12;
+				}
+				break;
+			case I_SUBANNOTATION:
+				{
+				alt9=13;
+				}
+				break;
+			case I_ENCODED_FIELD:
+				{
+				alt9=14;
+				}
+				break;
+			case I_ENCODED_METHOD:
+				{
+				alt9=15;
+				}
+				break;
+			case I_ENCODED_ENUM:
+				{
+				alt9=16;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 9, 0, input);
+				throw nvae;
+			}
+			switch (alt9) {
+				case 1 :
+					// smaliTreeWalker.g:273:5: integer_literal
+					{
+					pushFollow(FOLLOW_integer_literal_in_literal442);
+					integer_literal24=integer_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableIntEncodedValue(integer_literal24); 
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:274:5: long_literal
+					{
+					pushFollow(FOLLOW_long_literal_in_literal450);
+					long_literal25=long_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableLongEncodedValue(long_literal25); 
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:275:5: short_literal
+					{
+					pushFollow(FOLLOW_short_literal_in_literal458);
+					short_literal26=short_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableShortEncodedValue(short_literal26); 
+					}
+					break;
+				case 4 :
+					// smaliTreeWalker.g:276:5: byte_literal
+					{
+					pushFollow(FOLLOW_byte_literal_in_literal466);
+					byte_literal27=byte_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableByteEncodedValue(byte_literal27); 
+					}
+					break;
+				case 5 :
+					// smaliTreeWalker.g:277:5: float_literal
+					{
+					pushFollow(FOLLOW_float_literal_in_literal474);
+					float_literal28=float_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableFloatEncodedValue(float_literal28); 
+					}
+					break;
+				case 6 :
+					// smaliTreeWalker.g:278:5: double_literal
+					{
+					pushFollow(FOLLOW_double_literal_in_literal482);
+					double_literal29=double_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableDoubleEncodedValue(double_literal29); 
+					}
+					break;
+				case 7 :
+					// smaliTreeWalker.g:279:5: char_literal
+					{
+					pushFollow(FOLLOW_char_literal_in_literal490);
+					char_literal30=char_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableCharEncodedValue(char_literal30); 
+					}
+					break;
+				case 8 :
+					// smaliTreeWalker.g:280:5: string_literal
+					{
+					pushFollow(FOLLOW_string_literal_in_literal498);
+					string_literal31=string_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableStringEncodedValue(string_literal31); 
+					}
+					break;
+				case 9 :
+					// smaliTreeWalker.g:281:5: bool_literal
+					{
+					pushFollow(FOLLOW_bool_literal_in_literal506);
+					bool_literal32=bool_literal();
+					state._fsp--;
+
+					 encodedValue = ImmutableBooleanEncodedValue.forBoolean(bool_literal32); 
+					}
+					break;
+				case 10 :
+					// smaliTreeWalker.g:282:5: NULL_LITERAL
+					{
+					match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal514); 
+					 encodedValue = ImmutableNullEncodedValue.INSTANCE; 
+					}
+					break;
+				case 11 :
+					// smaliTreeWalker.g:283:5: type_descriptor
+					{
+					pushFollow(FOLLOW_type_descriptor_in_literal522);
+					type_descriptor33=type_descriptor();
+					state._fsp--;
+
+					 encodedValue = new ImmutableTypeEncodedValue(type_descriptor33); 
+					}
+					break;
+				case 12 :
+					// smaliTreeWalker.g:284:5: array_literal
+					{
+					pushFollow(FOLLOW_array_literal_in_literal530);
+					array_literal34=array_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableArrayEncodedValue(array_literal34); 
+					}
+					break;
+				case 13 :
+					// smaliTreeWalker.g:285:5: subannotation
+					{
+					pushFollow(FOLLOW_subannotation_in_literal538);
+					subannotation35=subannotation();
+					state._fsp--;
+
+					 encodedValue = new ImmutableAnnotationEncodedValue((subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).annotationType:null), (subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).elements:null)); 
+					}
+					break;
+				case 14 :
+					// smaliTreeWalker.g:286:5: field_literal
+					{
+					pushFollow(FOLLOW_field_literal_in_literal546);
+					field_literal36=field_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableFieldEncodedValue(field_literal36); 
+					}
+					break;
+				case 15 :
+					// smaliTreeWalker.g:287:5: method_literal
+					{
+					pushFollow(FOLLOW_method_literal_in_literal554);
+					method_literal37=method_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableMethodEncodedValue(method_literal37); 
+					}
+					break;
+				case 16 :
+					// smaliTreeWalker.g:288:5: enum_literal
+					{
+					pushFollow(FOLLOW_enum_literal_in_literal562);
+					enum_literal38=enum_literal();
+					state._fsp--;
+
+					 encodedValue = new ImmutableEnumEncodedValue(enum_literal38); 
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return encodedValue;
+	}
+	// $ANTLR end "literal"
+
+
+
+	// $ANTLR start "fixed_64bit_literal_number"
+	// smaliTreeWalker.g:291:1: fixed_64bit_literal_number returns [Number value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal );
+	public final Number fixed_64bit_literal_number() throws RecognitionException {
+		Number value = null;
+
+
+		int integer_literal39 =0;
+		long long_literal40 =0;
+		short short_literal41 =0;
+		byte byte_literal42 =0;
+		float float_literal43 =0.0f;
+		double double_literal44 =0.0;
+		char char_literal45 =0;
+		boolean bool_literal46 =false;
+
+		try {
+			// smaliTreeWalker.g:292:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal )
+			int alt10=8;
+			switch ( input.LA(1) ) {
+			case INTEGER_LITERAL:
+				{
+				alt10=1;
+				}
+				break;
+			case LONG_LITERAL:
+				{
+				alt10=2;
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt10=3;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt10=4;
+				}
+				break;
+			case FLOAT_LITERAL:
+				{
+				alt10=5;
+				}
+				break;
+			case DOUBLE_LITERAL:
+				{
+				alt10=6;
+				}
+				break;
+			case CHAR_LITERAL:
+				{
+				alt10=7;
+				}
+				break;
+			case BOOL_LITERAL:
+				{
+				alt10=8;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 10, 0, input);
+				throw nvae;
+			}
+			switch (alt10) {
+				case 1 :
+					// smaliTreeWalker.g:292:5: integer_literal
+					{
+					pushFollow(FOLLOW_integer_literal_in_fixed_64bit_literal_number578);
+					integer_literal39=integer_literal();
+					state._fsp--;
+
+					 value = integer_literal39; 
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:293:5: long_literal
+					{
+					pushFollow(FOLLOW_long_literal_in_fixed_64bit_literal_number586);
+					long_literal40=long_literal();
+					state._fsp--;
+
+					 value = long_literal40; 
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:294:5: short_literal
+					{
+					pushFollow(FOLLOW_short_literal_in_fixed_64bit_literal_number594);
+					short_literal41=short_literal();
+					state._fsp--;
+
+					 value = short_literal41; 
+					}
+					break;
+				case 4 :
+					// smaliTreeWalker.g:295:5: byte_literal
+					{
+					pushFollow(FOLLOW_byte_literal_in_fixed_64bit_literal_number602);
+					byte_literal42=byte_literal();
+					state._fsp--;
+
+					 value = byte_literal42; 
+					}
+					break;
+				case 5 :
+					// smaliTreeWalker.g:296:5: float_literal
+					{
+					pushFollow(FOLLOW_float_literal_in_fixed_64bit_literal_number610);
+					float_literal43=float_literal();
+					state._fsp--;
+
+					 value = Float.floatToRawIntBits(float_literal43); 
+					}
+					break;
+				case 6 :
+					// smaliTreeWalker.g:297:5: double_literal
+					{
+					pushFollow(FOLLOW_double_literal_in_fixed_64bit_literal_number618);
+					double_literal44=double_literal();
+					state._fsp--;
+
+					 value = Double.doubleToRawLongBits(double_literal44); 
+					}
+					break;
+				case 7 :
+					// smaliTreeWalker.g:298:5: char_literal
+					{
+					pushFollow(FOLLOW_char_literal_in_fixed_64bit_literal_number626);
+					char_literal45=char_literal();
+					state._fsp--;
+
+					 value = (int)char_literal45; 
+					}
+					break;
+				case 8 :
+					// smaliTreeWalker.g:299:5: bool_literal
+					{
+					pushFollow(FOLLOW_bool_literal_in_fixed_64bit_literal_number634);
+					bool_literal46=bool_literal();
+					state._fsp--;
+
+					 value = bool_literal46?1:0; 
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "fixed_64bit_literal_number"
+
+
+
+	// $ANTLR start "fixed_64bit_literal"
+	// smaliTreeWalker.g:301:1: fixed_64bit_literal returns [long value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal );
+	public final long fixed_64bit_literal() throws RecognitionException {
+		long value = 0;
+
+
+		int integer_literal47 =0;
+		long long_literal48 =0;
+		short short_literal49 =0;
+		byte byte_literal50 =0;
+		float float_literal51 =0.0f;
+		double double_literal52 =0.0;
+		char char_literal53 =0;
+		boolean bool_literal54 =false;
+
+		try {
+			// smaliTreeWalker.g:302:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal )
+			int alt11=8;
+			switch ( input.LA(1) ) {
+			case INTEGER_LITERAL:
+				{
+				alt11=1;
+				}
+				break;
+			case LONG_LITERAL:
+				{
+				alt11=2;
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt11=3;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt11=4;
+				}
+				break;
+			case FLOAT_LITERAL:
+				{
+				alt11=5;
+				}
+				break;
+			case DOUBLE_LITERAL:
+				{
+				alt11=6;
+				}
+				break;
+			case CHAR_LITERAL:
+				{
+				alt11=7;
+				}
+				break;
+			case BOOL_LITERAL:
+				{
+				alt11=8;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 11, 0, input);
+				throw nvae;
+			}
+			switch (alt11) {
+				case 1 :
+					// smaliTreeWalker.g:302:5: integer_literal
+					{
+					pushFollow(FOLLOW_integer_literal_in_fixed_64bit_literal649);
+					integer_literal47=integer_literal();
+					state._fsp--;
+
+					 value = integer_literal47; 
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:303:5: long_literal
+					{
+					pushFollow(FOLLOW_long_literal_in_fixed_64bit_literal657);
+					long_literal48=long_literal();
+					state._fsp--;
+
+					 value = long_literal48; 
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:304:5: short_literal
+					{
+					pushFollow(FOLLOW_short_literal_in_fixed_64bit_literal665);
+					short_literal49=short_literal();
+					state._fsp--;
+
+					 value = short_literal49; 
+					}
+					break;
+				case 4 :
+					// smaliTreeWalker.g:305:5: byte_literal
+					{
+					pushFollow(FOLLOW_byte_literal_in_fixed_64bit_literal673);
+					byte_literal50=byte_literal();
+					state._fsp--;
+
+					 value = byte_literal50; 
+					}
+					break;
+				case 5 :
+					// smaliTreeWalker.g:306:5: float_literal
+					{
+					pushFollow(FOLLOW_float_literal_in_fixed_64bit_literal681);
+					float_literal51=float_literal();
+					state._fsp--;
+
+					 value = Float.floatToRawIntBits(float_literal51); 
+					}
+					break;
+				case 6 :
+					// smaliTreeWalker.g:307:5: double_literal
+					{
+					pushFollow(FOLLOW_double_literal_in_fixed_64bit_literal689);
+					double_literal52=double_literal();
+					state._fsp--;
+
+					 value = Double.doubleToRawLongBits(double_literal52); 
+					}
+					break;
+				case 7 :
+					// smaliTreeWalker.g:308:5: char_literal
+					{
+					pushFollow(FOLLOW_char_literal_in_fixed_64bit_literal697);
+					char_literal53=char_literal();
+					state._fsp--;
+
+					 value = char_literal53; 
+					}
+					break;
+				case 8 :
+					// smaliTreeWalker.g:309:5: bool_literal
+					{
+					pushFollow(FOLLOW_bool_literal_in_fixed_64bit_literal705);
+					bool_literal54=bool_literal();
+					state._fsp--;
+
+					 value = bool_literal54?1:0; 
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "fixed_64bit_literal"
+
+
+
+	// $ANTLR start "fixed_32bit_literal"
+	// smaliTreeWalker.g:313:1: fixed_32bit_literal returns [int value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal );
+	public final int fixed_32bit_literal() throws RecognitionException {
+		int value = 0;
+
+
+		int integer_literal55 =0;
+		long long_literal56 =0;
+		short short_literal57 =0;
+		byte byte_literal58 =0;
+		float float_literal59 =0.0f;
+		char char_literal60 =0;
+		boolean bool_literal61 =false;
+
+		try {
+			// smaliTreeWalker.g:314:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal )
+			int alt12=7;
+			switch ( input.LA(1) ) {
+			case INTEGER_LITERAL:
+				{
+				alt12=1;
+				}
+				break;
+			case LONG_LITERAL:
+				{
+				alt12=2;
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt12=3;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt12=4;
+				}
+				break;
+			case FLOAT_LITERAL:
+				{
+				alt12=5;
+				}
+				break;
+			case CHAR_LITERAL:
+				{
+				alt12=6;
+				}
+				break;
+			case BOOL_LITERAL:
+				{
+				alt12=7;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 12, 0, input);
+				throw nvae;
+			}
+			switch (alt12) {
+				case 1 :
+					// smaliTreeWalker.g:314:5: integer_literal
+					{
+					pushFollow(FOLLOW_integer_literal_in_fixed_32bit_literal722);
+					integer_literal55=integer_literal();
+					state._fsp--;
+
+					 value = integer_literal55; 
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:315:5: long_literal
+					{
+					pushFollow(FOLLOW_long_literal_in_fixed_32bit_literal730);
+					long_literal56=long_literal();
+					state._fsp--;
+
+					 LiteralTools.checkInt(long_literal56); value = (int)long_literal56; 
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:316:5: short_literal
+					{
+					pushFollow(FOLLOW_short_literal_in_fixed_32bit_literal738);
+					short_literal57=short_literal();
+					state._fsp--;
+
+					 value = short_literal57; 
+					}
+					break;
+				case 4 :
+					// smaliTreeWalker.g:317:5: byte_literal
+					{
+					pushFollow(FOLLOW_byte_literal_in_fixed_32bit_literal746);
+					byte_literal58=byte_literal();
+					state._fsp--;
+
+					 value = byte_literal58; 
+					}
+					break;
+				case 5 :
+					// smaliTreeWalker.g:318:5: float_literal
+					{
+					pushFollow(FOLLOW_float_literal_in_fixed_32bit_literal754);
+					float_literal59=float_literal();
+					state._fsp--;
+
+					 value = Float.floatToRawIntBits(float_literal59); 
+					}
+					break;
+				case 6 :
+					// smaliTreeWalker.g:319:5: char_literal
+					{
+					pushFollow(FOLLOW_char_literal_in_fixed_32bit_literal762);
+					char_literal60=char_literal();
+					state._fsp--;
+
+					 value = char_literal60; 
+					}
+					break;
+				case 7 :
+					// smaliTreeWalker.g:320:5: bool_literal
+					{
+					pushFollow(FOLLOW_bool_literal_in_fixed_32bit_literal770);
+					bool_literal61=bool_literal();
+					state._fsp--;
+
+					 value = bool_literal61?1:0; 
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "fixed_32bit_literal"
+
+
+
+	// $ANTLR start "array_elements"
+	// smaliTreeWalker.g:322:1: array_elements returns [List<Number> elements] : ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) ;
+	public final List<Number> array_elements() throws RecognitionException {
+		List<Number> elements = null;
+
+
+		Number fixed_64bit_literal_number62 =null;
+
+		try {
+			// smaliTreeWalker.g:323:3: ( ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) )
+			// smaliTreeWalker.g:323:5: ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* )
+			{
+			elements = Lists.newArrayList();
+			match(input,I_ARRAY_ELEMENTS,FOLLOW_I_ARRAY_ELEMENTS_in_array_elements792); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:325:7: ( fixed_64bit_literal_number )*
+				loop13:
+				while (true) {
+					int alt13=2;
+					int LA13_0 = input.LA(1);
+					if ( ((LA13_0 >= BOOL_LITERAL && LA13_0 <= BYTE_LITERAL)||LA13_0==CHAR_LITERAL||LA13_0==DOUBLE_LITERAL||LA13_0==FLOAT_LITERAL||LA13_0==INTEGER_LITERAL||LA13_0==LONG_LITERAL||LA13_0==SHORT_LITERAL) ) {
+						alt13=1;
+					}
+
+					switch (alt13) {
+					case 1 :
+						// smaliTreeWalker.g:325:8: fixed_64bit_literal_number
+						{
+						pushFollow(FOLLOW_fixed_64bit_literal_number_in_array_elements801);
+						fixed_64bit_literal_number62=fixed_64bit_literal_number();
+						state._fsp--;
+
+
+						        elements.add(fixed_64bit_literal_number62);
+						      
+						}
+						break;
+
+					default :
+						break loop13;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return elements;
+	}
+	// $ANTLR end "array_elements"
+
+
+
+	// $ANTLR start "packed_switch_elements"
+	// smaliTreeWalker.g:330:1: packed_switch_elements returns [List<Label> elements] : ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) ;
+	public final List<Label> packed_switch_elements() throws RecognitionException {
+		List<Label> elements = null;
+
+
+		Label label_ref63 =null;
+
+		elements = Lists.newArrayList();
+		try {
+			// smaliTreeWalker.g:332:3: ( ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) )
+			// smaliTreeWalker.g:333:5: ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* )
+			{
+			match(input,I_PACKED_SWITCH_ELEMENTS,FOLLOW_I_PACKED_SWITCH_ELEMENTS_in_packed_switch_elements837); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:334:7: ( label_ref )*
+				loop14:
+				while (true) {
+					int alt14=2;
+					int LA14_0 = input.LA(1);
+					if ( (LA14_0==SIMPLE_NAME) ) {
+						alt14=1;
+					}
+
+					switch (alt14) {
+					case 1 :
+						// smaliTreeWalker.g:334:8: label_ref
+						{
+						pushFollow(FOLLOW_label_ref_in_packed_switch_elements846);
+						label_ref63=label_ref();
+						state._fsp--;
+
+						 elements.add(label_ref63); 
+						}
+						break;
+
+					default :
+						break loop14;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return elements;
+	}
+	// $ANTLR end "packed_switch_elements"
+
+
+
+	// $ANTLR start "sparse_switch_elements"
+	// smaliTreeWalker.g:337:1: sparse_switch_elements returns [List<SwitchLabelElement> elements] : ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) ;
+	public final List<SwitchLabelElement> sparse_switch_elements() throws RecognitionException {
+		List<SwitchLabelElement> elements = null;
+
+
+		int fixed_32bit_literal64 =0;
+		Label label_ref65 =null;
+
+		elements = Lists.newArrayList();
+		try {
+			// smaliTreeWalker.g:339:3: ( ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) )
+			// smaliTreeWalker.g:340:5: ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* )
+			{
+			match(input,I_SPARSE_SWITCH_ELEMENTS,FOLLOW_I_SPARSE_SWITCH_ELEMENTS_in_sparse_switch_elements881); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:341:8: ( fixed_32bit_literal label_ref )*
+				loop15:
+				while (true) {
+					int alt15=2;
+					int LA15_0 = input.LA(1);
+					if ( ((LA15_0 >= BOOL_LITERAL && LA15_0 <= BYTE_LITERAL)||LA15_0==CHAR_LITERAL||LA15_0==FLOAT_LITERAL||LA15_0==INTEGER_LITERAL||LA15_0==LONG_LITERAL||LA15_0==SHORT_LITERAL) ) {
+						alt15=1;
+					}
+
+					switch (alt15) {
+					case 1 :
+						// smaliTreeWalker.g:341:9: fixed_32bit_literal label_ref
+						{
+						pushFollow(FOLLOW_fixed_32bit_literal_in_sparse_switch_elements891);
+						fixed_32bit_literal64=fixed_32bit_literal();
+						state._fsp--;
+
+						pushFollow(FOLLOW_label_ref_in_sparse_switch_elements893);
+						label_ref65=label_ref();
+						state._fsp--;
+
+
+						         elements.add(new SwitchLabelElement(fixed_32bit_literal64, label_ref65));
+						       
+						}
+						break;
+
+					default :
+						break loop15;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return elements;
+	}
+	// $ANTLR end "sparse_switch_elements"
+
+
+	protected static class method_scope {
+		boolean isStatic;
+		int totalMethodRegisters;
+		int methodParameterRegisters;
+		MethodImplementationBuilder methodBuilder;
+	}
+	protected Stack<method_scope> method_stack = new Stack<method_scope>();
+
+
+	// $ANTLR start "method"
+	// smaliTreeWalker.g:347:1: method returns [BuilderMethod ret] : ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) ;
+	public final BuilderMethod method() throws RecognitionException {
+		method_stack.push(new method_scope());
+		BuilderMethod ret = null;
+
+
+		CommonTree I_METHOD70=null;
+		int access_list66 =0;
+		TreeRuleReturnScope method_name_and_prototype67 =null;
+		TreeRuleReturnScope registers_directive68 =null;
+		List<BuilderTryBlock> catches69 =null;
+		Set<Annotation> annotations71 =null;
+
+
+		    method_stack.peek().totalMethodRegisters = 0;
+		    method_stack.peek().methodParameterRegisters = 0;
+		    int accessFlags = 0;
+		    method_stack.peek().isStatic = false;
+		  
+		try {
+			// smaliTreeWalker.g:362:3: ( ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) )
+			// smaliTreeWalker.g:363:5: ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations )
+			{
+			I_METHOD70=(CommonTree)match(input,I_METHOD,FOLLOW_I_METHOD_in_method945); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_method_name_and_prototype_in_method953);
+			method_name_and_prototype67=method_name_and_prototype();
+			state._fsp--;
+
+			pushFollow(FOLLOW_access_list_in_method961);
+			access_list66=access_list();
+			state._fsp--;
+
+
+			        accessFlags = access_list66;
+			        method_stack.peek().isStatic = AccessFlags.STATIC.isSet(accessFlags);
+			        method_stack.peek().methodParameterRegisters =
+			                MethodUtil.getParameterRegisterCount((method_name_and_prototype67!=null?((smaliTreeWalker.method_name_and_prototype_return)method_name_and_prototype67).parameters:null), method_stack.peek().isStatic);
+			      
+			// smaliTreeWalker.g:372:7: ( ( registers_directive ) |)
+			int alt16=2;
+			int LA16_0 = input.LA(1);
+			if ( (LA16_0==I_LOCALS||LA16_0==I_REGISTERS) ) {
+				alt16=1;
+			}
+			else if ( (LA16_0==I_ORDERED_METHOD_ITEMS) ) {
+				alt16=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 16, 0, input);
+				throw nvae;
+			}
+
+			switch (alt16) {
+				case 1 :
+					// smaliTreeWalker.g:373:9: ( registers_directive )
+					{
+					// smaliTreeWalker.g:373:9: ( registers_directive )
+					// smaliTreeWalker.g:373:10: registers_directive
+					{
+					pushFollow(FOLLOW_registers_directive_in_method988);
+					registers_directive68=registers_directive();
+					state._fsp--;
+
+
+					          if ((registers_directive68!=null?((smaliTreeWalker.registers_directive_return)registers_directive68).isLocalsDirective:false)) {
+					            method_stack.peek().totalMethodRegisters = (registers_directive68!=null?((smaliTreeWalker.registers_directive_return)registers_directive68).registers:0) + method_stack.peek().methodParameterRegisters;
+					          } else {
+					            method_stack.peek().totalMethodRegisters = (registers_directive68!=null?((smaliTreeWalker.registers_directive_return)registers_directive68).registers:0);
+					          }
+
+					          method_stack.peek().methodBuilder = new MethodImplementationBuilder(method_stack.peek().totalMethodRegisters);
+
+					        
+					}
+
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:386:9: 
+					{
+
+					          method_stack.peek().methodBuilder = new MethodImplementationBuilder(0);
+					        
+					}
+					break;
+
+			}
+
+			pushFollow(FOLLOW_ordered_method_items_in_method1045);
+			ordered_method_items();
+			state._fsp--;
+
+			pushFollow(FOLLOW_catches_in_method1053);
+			catches69=catches();
+			state._fsp--;
+
+			pushFollow(FOLLOW_parameters_in_method1061);
+			parameters((method_name_and_prototype67!=null?((smaliTreeWalker.method_name_and_prototype_return)method_name_and_prototype67).parameters:null));
+			state._fsp--;
+
+			pushFollow(FOLLOW_annotations_in_method1070);
+			annotations71=annotations();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			    MethodImplementation methodImplementation = null;
+			    List<BuilderTryBlock> tryBlocks = catches69;
+
+			    boolean isAbstract = false;
+			    boolean isNative = false;
+
+			    if ((accessFlags & AccessFlags.ABSTRACT.getValue()) != 0) {
+			      isAbstract = true;
+			    } else if ((accessFlags & AccessFlags.NATIVE.getValue()) != 0) {
+			      isNative = true;
+			    }
+
+			    methodImplementation = method_stack.peek().methodBuilder.getMethodImplementation();
+
+			    if (Iterables.isEmpty(methodImplementation.getInstructions())) {
+			      if (!isAbstract && !isNative) {
+			        throw new SemanticException(input, I_METHOD70, "A non-abstract/non-native method must have at least 1 instruction");
+			      }
+
+			      String methodType;
+			      if (isAbstract) {
+			        methodType = "an abstract";
+			      } else {
+			        methodType = "a native";
+			      }
+
+			      if ((registers_directive68!=null?((CommonTree)registers_directive68.start):null) != null) {
+			        if ((registers_directive68!=null?((smaliTreeWalker.registers_directive_return)registers_directive68).isLocalsDirective:false)) {
+			          throw new SemanticException(input, (registers_directive68!=null?((CommonTree)registers_directive68.start):null), "A .locals directive is not valid in %s method", methodType);
+			        } else {
+			          throw new SemanticException(input, (registers_directive68!=null?((CommonTree)registers_directive68.start):null), "A .registers directive is not valid in %s method", methodType);
+			        }
+			      }
+
+			      if (methodImplementation.getTryBlocks().size() > 0) {
+			        throw new SemanticException(input, I_METHOD70, "try/catch blocks cannot be present in %s method", methodType);
+			      }
+
+			      if (!Iterables.isEmpty(methodImplementation.getDebugItems())) {
+			        throw new SemanticException(input, I_METHOD70, "debug directives cannot be present in %s method", methodType);
+			      }
+
+			      methodImplementation = null;
+			    } else {
+			      if (isAbstract) {
+			        throw new SemanticException(input, I_METHOD70, "An abstract method cannot have any instructions");
+			      }
+			      if (isNative) {
+			        throw new SemanticException(input, I_METHOD70, "A native method cannot have any instructions");
+			      }
+
+			      if ((registers_directive68!=null?((CommonTree)registers_directive68.start):null) == null) {
+			        throw new SemanticException(input, I_METHOD70, "A .registers or .locals directive must be present for a non-abstract/non-final method");
+			      }
+
+			      if (method_stack.peek().totalMethodRegisters < method_stack.peek().methodParameterRegisters) {
+			        throw new SemanticException(input, (registers_directive68!=null?((CommonTree)registers_directive68.start):null), "This method requires at least " +
+			                Integer.toString(method_stack.peek().methodParameterRegisters) +
+			                " registers, for the method parameters");
+			      }
+			    }
+
+			    ret = dexBuilder.internMethod(
+			            classType,
+			            (method_name_and_prototype67!=null?((smaliTreeWalker.method_name_and_prototype_return)method_name_and_prototype67).name:null),
+			            (method_name_and_prototype67!=null?((smaliTreeWalker.method_name_and_prototype_return)method_name_and_prototype67).parameters:null),
+			            (method_name_and_prototype67!=null?((smaliTreeWalker.method_name_and_prototype_return)method_name_and_prototype67).returnType:null),
+			            accessFlags,
+			            annotations71,
+			            methodImplementation);
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+			method_stack.pop();
+		}
+		return ret;
+	}
+	// $ANTLR end "method"
+
+
+	public static class method_prototype_return extends TreeRuleReturnScope {
+		public List<String> parameters;
+		public String returnType;
+	};
+
+
+	// $ANTLR start "method_prototype"
+	// smaliTreeWalker.g:468:1: method_prototype returns [List<String> parameters, String returnType] : ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) ;
+	public final smaliTreeWalker.method_prototype_return method_prototype() throws RecognitionException {
+		smaliTreeWalker.method_prototype_return retval = new smaliTreeWalker.method_prototype_return();
+		retval.start = input.LT(1);
+
+		String type_descriptor72 =null;
+		List<String> method_type_list73 =null;
+
+		try {
+			// smaliTreeWalker.g:469:3: ( ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) )
+			// smaliTreeWalker.g:469:5: ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list )
+			{
+			match(input,I_METHOD_PROTOTYPE,FOLLOW_I_METHOD_PROTOTYPE_in_method_prototype1094); 
+			match(input, Token.DOWN, null); 
+			match(input,I_METHOD_RETURN_TYPE,FOLLOW_I_METHOD_RETURN_TYPE_in_method_prototype1097); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_type_descriptor_in_method_prototype1099);
+			type_descriptor72=type_descriptor();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+			pushFollow(FOLLOW_method_type_list_in_method_prototype1102);
+			method_type_list73=method_type_list();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			    retval.returnType = type_descriptor72;
+			    retval.parameters = method_type_list73;
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "method_prototype"
+
+
+	public static class method_name_and_prototype_return extends TreeRuleReturnScope {
+		public String name;
+		public List<SmaliMethodParameter> parameters;
+		public String returnType;
+	};
+
+
+	// $ANTLR start "method_name_and_prototype"
+	// smaliTreeWalker.g:475:1: method_name_and_prototype returns [String name, List<SmaliMethodParameter> parameters, String returnType] : SIMPLE_NAME method_prototype ;
+	public final smaliTreeWalker.method_name_and_prototype_return method_name_and_prototype() throws RecognitionException {
+		smaliTreeWalker.method_name_and_prototype_return retval = new smaliTreeWalker.method_name_and_prototype_return();
+		retval.start = input.LT(1);
+
+		CommonTree SIMPLE_NAME74=null;
+		TreeRuleReturnScope method_prototype75 =null;
+
+		try {
+			// smaliTreeWalker.g:476:3: ( SIMPLE_NAME method_prototype )
+			// smaliTreeWalker.g:476:5: SIMPLE_NAME method_prototype
+			{
+			SIMPLE_NAME74=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_name_and_prototype1120); 
+			pushFollow(FOLLOW_method_prototype_in_method_name_and_prototype1122);
+			method_prototype75=method_prototype();
+			state._fsp--;
+
+
+			    retval.name = (SIMPLE_NAME74!=null?SIMPLE_NAME74.getText():null);
+			    retval.parameters = Lists.newArrayList();
+
+			    int paramRegister = 0;
+			    for (String type: (method_prototype75!=null?((smaliTreeWalker.method_prototype_return)method_prototype75).parameters:null)) {
+			        retval.parameters.add(new SmaliMethodParameter(paramRegister++, type));
+			        char c = type.charAt(0);
+			        if (c == 'D' || c == 'J') {
+			            paramRegister++;
+			        }
+			    }
+			    retval.returnType = (method_prototype75!=null?((smaliTreeWalker.method_prototype_return)method_prototype75).returnType:null);
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "method_name_and_prototype"
+
+
+
+	// $ANTLR start "method_type_list"
+	// smaliTreeWalker.g:492:1: method_type_list returns [List<String> types] : ( nonvoid_type_descriptor )* ;
+	public final List<String> method_type_list() throws RecognitionException {
+		List<String> types = null;
+
+
+		TreeRuleReturnScope nonvoid_type_descriptor76 =null;
+
+
+		    types = Lists.newArrayList();
+		  
+		try {
+			// smaliTreeWalker.g:497:3: ( ( nonvoid_type_descriptor )* )
+			// smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )*
+			{
+			// smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )*
+			loop17:
+			while (true) {
+				int alt17=2;
+				int LA17_0 = input.LA(1);
+				if ( (LA17_0==ARRAY_TYPE_PREFIX||LA17_0==CLASS_DESCRIPTOR||LA17_0==PRIMITIVE_TYPE) ) {
+					alt17=1;
+				}
+
+				switch (alt17) {
+				case 1 :
+					// smaliTreeWalker.g:498:7: nonvoid_type_descriptor
+					{
+					pushFollow(FOLLOW_nonvoid_type_descriptor_in_method_type_list1156);
+					nonvoid_type_descriptor76=nonvoid_type_descriptor();
+					state._fsp--;
+
+
+					        types.add((nonvoid_type_descriptor76!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor76).type:null));
+					      
+					}
+					break;
+
+				default :
+					break loop17;
+				}
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return types;
+	}
+	// $ANTLR end "method_type_list"
+
+
+
+	// $ANTLR start "method_reference"
+	// smaliTreeWalker.g:505:1: method_reference returns [ImmutableMethodReference methodReference] : ( reference_type_descriptor )? SIMPLE_NAME method_prototype ;
+	public final ImmutableMethodReference method_reference() throws RecognitionException {
+		ImmutableMethodReference methodReference = null;
+
+
+		CommonTree SIMPLE_NAME78=null;
+		TreeRuleReturnScope reference_type_descriptor77 =null;
+		TreeRuleReturnScope method_prototype79 =null;
+
+		try {
+			// smaliTreeWalker.g:506:3: ( ( reference_type_descriptor )? SIMPLE_NAME method_prototype )
+			// smaliTreeWalker.g:506:5: ( reference_type_descriptor )? SIMPLE_NAME method_prototype
+			{
+			// smaliTreeWalker.g:506:5: ( reference_type_descriptor )?
+			int alt18=2;
+			int LA18_0 = input.LA(1);
+			if ( (LA18_0==ARRAY_TYPE_PREFIX||LA18_0==CLASS_DESCRIPTOR) ) {
+				alt18=1;
+			}
+			switch (alt18) {
+				case 1 :
+					// smaliTreeWalker.g:506:5: reference_type_descriptor
+					{
+					pushFollow(FOLLOW_reference_type_descriptor_in_method_reference1185);
+					reference_type_descriptor77=reference_type_descriptor();
+					state._fsp--;
+
+					}
+					break;
+
+			}
+
+			SIMPLE_NAME78=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_reference1188); 
+			pushFollow(FOLLOW_method_prototype_in_method_reference1190);
+			method_prototype79=method_prototype();
+			state._fsp--;
+
+
+			    String type;
+			    if ((reference_type_descriptor77!=null?((smaliTreeWalker.reference_type_descriptor_return)reference_type_descriptor77).type:null) == null) {
+			        type = classType;
+			    } else {
+			        type = (reference_type_descriptor77!=null?((smaliTreeWalker.reference_type_descriptor_return)reference_type_descriptor77).type:null);
+			    }
+			    methodReference = new ImmutableMethodReference(type, (SIMPLE_NAME78!=null?SIMPLE_NAME78.getText():null),
+			             (method_prototype79!=null?((smaliTreeWalker.method_prototype_return)method_prototype79).parameters:null), (method_prototype79!=null?((smaliTreeWalker.method_prototype_return)method_prototype79).returnType:null));
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return methodReference;
+	}
+	// $ANTLR end "method_reference"
+
+
+
+	// $ANTLR start "field_reference"
+	// smaliTreeWalker.g:518:1: field_reference returns [ImmutableFieldReference fieldReference] : ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor ;
+	public final ImmutableFieldReference field_reference() throws RecognitionException {
+		ImmutableFieldReference fieldReference = null;
+
+
+		CommonTree SIMPLE_NAME81=null;
+		TreeRuleReturnScope reference_type_descriptor80 =null;
+		TreeRuleReturnScope nonvoid_type_descriptor82 =null;
+
+		try {
+			// smaliTreeWalker.g:519:3: ( ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor )
+			// smaliTreeWalker.g:519:5: ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor
+			{
+			// smaliTreeWalker.g:519:5: ( reference_type_descriptor )?
+			int alt19=2;
+			int LA19_0 = input.LA(1);
+			if ( (LA19_0==ARRAY_TYPE_PREFIX||LA19_0==CLASS_DESCRIPTOR) ) {
+				alt19=1;
+			}
+			switch (alt19) {
+				case 1 :
+					// smaliTreeWalker.g:519:5: reference_type_descriptor
+					{
+					pushFollow(FOLLOW_reference_type_descriptor_in_field_reference1207);
+					reference_type_descriptor80=reference_type_descriptor();
+					state._fsp--;
+
+					}
+					break;
+
+			}
+
+			SIMPLE_NAME81=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field_reference1210); 
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_field_reference1212);
+			nonvoid_type_descriptor82=nonvoid_type_descriptor();
+			state._fsp--;
+
+
+			    String type;
+			    if ((reference_type_descriptor80!=null?((smaliTreeWalker.reference_type_descriptor_return)reference_type_descriptor80).type:null) == null) {
+			        type = classType;
+			    } else {
+			        type = (reference_type_descriptor80!=null?((smaliTreeWalker.reference_type_descriptor_return)reference_type_descriptor80).type:null);
+			    }
+			    fieldReference = new ImmutableFieldReference(type, (SIMPLE_NAME81!=null?SIMPLE_NAME81.getText():null),
+			            (nonvoid_type_descriptor82!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor82).type:null));
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return fieldReference;
+	}
+	// $ANTLR end "field_reference"
+
+
+	public static class registers_directive_return extends TreeRuleReturnScope {
+		public boolean isLocalsDirective;
+		public int registers;
+	};
+
+
+	// $ANTLR start "registers_directive"
+	// smaliTreeWalker.g:531:1: registers_directive returns [boolean isLocalsDirective, int registers] : ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) ;
+	public final smaliTreeWalker.registers_directive_return registers_directive() throws RecognitionException {
+		smaliTreeWalker.registers_directive_return retval = new smaliTreeWalker.registers_directive_return();
+		retval.start = input.LT(1);
+
+		short short_integral_literal83 =0;
+
+		try {
+			// smaliTreeWalker.g:532:3: ( ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) )
+			// smaliTreeWalker.g:532:5: ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal )
+			{
+			retval.registers = 0;
+			// smaliTreeWalker.g:533:7: ( I_REGISTERS | I_LOCALS )
+			int alt20=2;
+			int LA20_0 = input.LA(1);
+			if ( (LA20_0==I_REGISTERS) ) {
+				alt20=1;
+			}
+			else if ( (LA20_0==I_LOCALS) ) {
+				alt20=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 20, 0, input);
+				throw nvae;
+			}
+
+			switch (alt20) {
+				case 1 :
+					// smaliTreeWalker.g:533:9: I_REGISTERS
+					{
+					match(input,I_REGISTERS,FOLLOW_I_REGISTERS_in_registers_directive1238); 
+					retval.isLocalsDirective = false;
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:534:9: I_LOCALS
+					{
+					match(input,I_LOCALS,FOLLOW_I_LOCALS_in_registers_directive1250); 
+					retval.isLocalsDirective = true;
+					}
+					break;
+
+			}
+
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_short_integral_literal_in_registers_directive1268);
+			short_integral_literal83=short_integral_literal();
+			state._fsp--;
+
+			retval.registers = short_integral_literal83 & 0xFFFF;
+			match(input, Token.UP, null); 
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "registers_directive"
+
+
+
+	// $ANTLR start "label_def"
+	// smaliTreeWalker.g:539:1: label_def : ^( I_LABEL SIMPLE_NAME ) ;
+	public final void label_def() throws RecognitionException {
+		CommonTree SIMPLE_NAME84=null;
+
+		try {
+			// smaliTreeWalker.g:540:3: ( ^( I_LABEL SIMPLE_NAME ) )
+			// smaliTreeWalker.g:540:5: ^( I_LABEL SIMPLE_NAME )
+			{
+			match(input,I_LABEL,FOLLOW_I_LABEL_in_label_def1288); 
+			match(input, Token.DOWN, null); 
+			SIMPLE_NAME84=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_def1290); 
+			match(input, Token.UP, null); 
+
+
+			    method_stack.peek().methodBuilder.addLabel((SIMPLE_NAME84!=null?SIMPLE_NAME84.getText():null));
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "label_def"
+
+
+
+	// $ANTLR start "catches"
+	// smaliTreeWalker.g:545:1: catches returns [List<BuilderTryBlock> tryBlocks] : ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ;
+	public final List<BuilderTryBlock> catches() throws RecognitionException {
+		List<BuilderTryBlock> tryBlocks = null;
+
+
+		tryBlocks = Lists.newArrayList();
+		try {
+			// smaliTreeWalker.g:547:3: ( ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) )
+			// smaliTreeWalker.g:547:5: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* )
+			{
+			match(input,I_CATCHES,FOLLOW_I_CATCHES_in_catches1316); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:547:17: ( catch_directive )*
+				loop21:
+				while (true) {
+					int alt21=2;
+					int LA21_0 = input.LA(1);
+					if ( (LA21_0==I_CATCH) ) {
+						alt21=1;
+					}
+
+					switch (alt21) {
+					case 1 :
+						// smaliTreeWalker.g:547:17: catch_directive
+						{
+						pushFollow(FOLLOW_catch_directive_in_catches1318);
+						catch_directive();
+						state._fsp--;
+
+						}
+						break;
+
+					default :
+						break loop21;
+					}
+				}
+
+				// smaliTreeWalker.g:547:34: ( catchall_directive )*
+				loop22:
+				while (true) {
+					int alt22=2;
+					int LA22_0 = input.LA(1);
+					if ( (LA22_0==I_CATCHALL) ) {
+						alt22=1;
+					}
+
+					switch (alt22) {
+					case 1 :
+						// smaliTreeWalker.g:547:34: catchall_directive
+						{
+						pushFollow(FOLLOW_catchall_directive_in_catches1321);
+						catchall_directive();
+						state._fsp--;
+
+						}
+						break;
+
+					default :
+						break loop22;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return tryBlocks;
+	}
+	// $ANTLR end "catches"
+
+
+
+	// $ANTLR start "catch_directive"
+	// smaliTreeWalker.g:549:1: catch_directive : ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) ;
+	public final void catch_directive() throws RecognitionException {
+		Label from =null;
+		Label to =null;
+		Label using =null;
+		TreeRuleReturnScope nonvoid_type_descriptor85 =null;
+
+		try {
+			// smaliTreeWalker.g:550:3: ( ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) )
+			// smaliTreeWalker.g:550:5: ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref )
+			{
+			match(input,I_CATCH,FOLLOW_I_CATCH_in_catch_directive1334); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_catch_directive1336);
+			nonvoid_type_descriptor85=nonvoid_type_descriptor();
+			state._fsp--;
+
+			pushFollow(FOLLOW_label_ref_in_catch_directive1340);
+			from=label_ref();
+			state._fsp--;
+
+			pushFollow(FOLLOW_label_ref_in_catch_directive1344);
+			to=label_ref();
+			state._fsp--;
+
+			pushFollow(FOLLOW_label_ref_in_catch_directive1348);
+			using=label_ref();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			    method_stack.peek().methodBuilder.addCatch(dexBuilder.internTypeReference((nonvoid_type_descriptor85!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor85).type:null)),
+			        from, to, using);
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "catch_directive"
+
+
+
+	// $ANTLR start "catchall_directive"
+	// smaliTreeWalker.g:556:1: catchall_directive : ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) ;
+	public final void catchall_directive() throws RecognitionException {
+		Label from =null;
+		Label to =null;
+		Label using =null;
+
+		try {
+			// smaliTreeWalker.g:557:3: ( ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) )
+			// smaliTreeWalker.g:557:5: ^( I_CATCHALL from= label_ref to= label_ref using= label_ref )
+			{
+			match(input,I_CATCHALL,FOLLOW_I_CATCHALL_in_catchall_directive1364); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_label_ref_in_catchall_directive1368);
+			from=label_ref();
+			state._fsp--;
+
+			pushFollow(FOLLOW_label_ref_in_catchall_directive1372);
+			to=label_ref();
+			state._fsp--;
+
+			pushFollow(FOLLOW_label_ref_in_catchall_directive1376);
+			using=label_ref();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			    method_stack.peek().methodBuilder.addCatch(from, to, using);
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "catchall_directive"
+
+
+
+	// $ANTLR start "parameters"
+	// smaliTreeWalker.g:562:1: parameters[List<SmaliMethodParameter> parameters] : ^( I_PARAMETERS ( parameter[parameters] )* ) ;
+	public final void parameters(List<SmaliMethodParameter> parameters) throws RecognitionException {
+		try {
+			// smaliTreeWalker.g:563:3: ( ^( I_PARAMETERS ( parameter[parameters] )* ) )
+			// smaliTreeWalker.g:563:5: ^( I_PARAMETERS ( parameter[parameters] )* )
+			{
+			match(input,I_PARAMETERS,FOLLOW_I_PARAMETERS_in_parameters1393); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:563:20: ( parameter[parameters] )*
+				loop23:
+				while (true) {
+					int alt23=2;
+					int LA23_0 = input.LA(1);
+					if ( (LA23_0==I_PARAMETER) ) {
+						alt23=1;
+					}
+
+					switch (alt23) {
+					case 1 :
+						// smaliTreeWalker.g:563:21: parameter[parameters]
+						{
+						pushFollow(FOLLOW_parameter_in_parameters1396);
+						parameter(parameters);
+						state._fsp--;
+
+						}
+						break;
+
+					default :
+						break loop23;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "parameters"
+
+
+
+	// $ANTLR start "parameter"
+	// smaliTreeWalker.g:565:1: parameter[List<SmaliMethodParameter> parameters] : ^( I_PARAMETER REGISTER ( string_literal )? annotations ) ;
+	public final void parameter(List<SmaliMethodParameter> parameters) throws RecognitionException {
+		CommonTree REGISTER86=null;
+		CommonTree I_PARAMETER87=null;
+		String string_literal88 =null;
+		Set<Annotation> annotations89 =null;
+
+		try {
+			// smaliTreeWalker.g:566:3: ( ^( I_PARAMETER REGISTER ( string_literal )? annotations ) )
+			// smaliTreeWalker.g:566:5: ^( I_PARAMETER REGISTER ( string_literal )? annotations )
+			{
+			I_PARAMETER87=(CommonTree)match(input,I_PARAMETER,FOLLOW_I_PARAMETER_in_parameter1412); 
+			match(input, Token.DOWN, null); 
+			REGISTER86=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_parameter1414); 
+			// smaliTreeWalker.g:566:28: ( string_literal )?
+			int alt24=2;
+			int LA24_0 = input.LA(1);
+			if ( (LA24_0==STRING_LITERAL) ) {
+				alt24=1;
+			}
+			switch (alt24) {
+				case 1 :
+					// smaliTreeWalker.g:566:28: string_literal
+					{
+					pushFollow(FOLLOW_string_literal_in_parameter1416);
+					string_literal88=string_literal();
+					state._fsp--;
+
+					}
+					break;
+
+			}
+
+			pushFollow(FOLLOW_annotations_in_parameter1419);
+			annotations89=annotations();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			        final int registerNumber = parseRegister_short((REGISTER86!=null?REGISTER86.getText():null));
+			        int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
+			        int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
+
+			        if (registerNumber >= totalMethodRegisters) {
+			            throw new SemanticException(input, I_PARAMETER87, "Register %s is larger than the maximum register v%d " +
+			                    "for this method", (REGISTER86!=null?REGISTER86.getText():null), totalMethodRegisters-1);
+			        }
+			        final int indexGuess = registerNumber - (totalMethodRegisters - methodParameterRegisters) - (method_stack.peek().isStatic?0:1);
+
+			        if (indexGuess < 0) {
+			            throw new SemanticException(input, I_PARAMETER87, "Register %s is not a parameter register.",
+			                    (REGISTER86!=null?REGISTER86.getText():null));
+			        }
+
+			        int parameterIndex = LinearSearch.linearSearch(parameters, SmaliMethodParameter.COMPARATOR,
+			            new WithRegister() { public int getRegister() { return indexGuess; } },
+			                indexGuess);
+
+			        if (parameterIndex < 0) {
+			            throw new SemanticException(input, I_PARAMETER87, "Register %s is the second half of a wide parameter.",
+			                                (REGISTER86!=null?REGISTER86.getText():null));
+			        }
+
+			        SmaliMethodParameter methodParameter = parameters.get(parameterIndex);
+			        methodParameter.name = string_literal88;
+			        if (annotations89 != null && annotations89.size() > 0) {
+			            methodParameter.annotations = annotations89;
+			        }
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "parameter"
+
+
+
+	// $ANTLR start "debug_directive"
+	// smaliTreeWalker.g:599:1: debug_directive : ( line | local | end_local | restart_local | prologue | epilogue | source );
+	public final void debug_directive() throws RecognitionException {
+		try {
+			// smaliTreeWalker.g:600:3: ( line | local | end_local | restart_local | prologue | epilogue | source )
+			int alt25=7;
+			switch ( input.LA(1) ) {
+			case I_LINE:
+				{
+				alt25=1;
+				}
+				break;
+			case I_LOCAL:
+				{
+				alt25=2;
+				}
+				break;
+			case I_END_LOCAL:
+				{
+				alt25=3;
+				}
+				break;
+			case I_RESTART_LOCAL:
+				{
+				alt25=4;
+				}
+				break;
+			case I_PROLOGUE:
+				{
+				alt25=5;
+				}
+				break;
+			case I_EPILOGUE:
+				{
+				alt25=6;
+				}
+				break;
+			case I_SOURCE:
+				{
+				alt25=7;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 25, 0, input);
+				throw nvae;
+			}
+			switch (alt25) {
+				case 1 :
+					// smaliTreeWalker.g:600:5: line
+					{
+					pushFollow(FOLLOW_line_in_debug_directive1436);
+					line();
+					state._fsp--;
+
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:601:5: local
+					{
+					pushFollow(FOLLOW_local_in_debug_directive1442);
+					local();
+					state._fsp--;
+
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:602:5: end_local
+					{
+					pushFollow(FOLLOW_end_local_in_debug_directive1448);
+					end_local();
+					state._fsp--;
+
+					}
+					break;
+				case 4 :
+					// smaliTreeWalker.g:603:5: restart_local
+					{
+					pushFollow(FOLLOW_restart_local_in_debug_directive1454);
+					restart_local();
+					state._fsp--;
+
+					}
+					break;
+				case 5 :
+					// smaliTreeWalker.g:604:5: prologue
+					{
+					pushFollow(FOLLOW_prologue_in_debug_directive1460);
+					prologue();
+					state._fsp--;
+
+					}
+					break;
+				case 6 :
+					// smaliTreeWalker.g:605:5: epilogue
+					{
+					pushFollow(FOLLOW_epilogue_in_debug_directive1466);
+					epilogue();
+					state._fsp--;
+
+					}
+					break;
+				case 7 :
+					// smaliTreeWalker.g:606:5: source
+					{
+					pushFollow(FOLLOW_source_in_debug_directive1472);
+					source();
+					state._fsp--;
+
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "debug_directive"
+
+
+
+	// $ANTLR start "line"
+	// smaliTreeWalker.g:608:1: line : ^( I_LINE integral_literal ) ;
+	public final void line() throws RecognitionException {
+		int integral_literal90 =0;
+
+		try {
+			// smaliTreeWalker.g:609:3: ( ^( I_LINE integral_literal ) )
+			// smaliTreeWalker.g:609:5: ^( I_LINE integral_literal )
+			{
+			match(input,I_LINE,FOLLOW_I_LINE_in_line1483); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_integral_literal_in_line1485);
+			integral_literal90=integral_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			        method_stack.peek().methodBuilder.addLineNumber(integral_literal90);
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "line"
+
+
+
+	// $ANTLR start "local"
+	// smaliTreeWalker.g:614:1: local : ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) ;
+	public final void local() throws RecognitionException {
+		CommonTree REGISTER91=null;
+		String name =null;
+		String signature =null;
+		TreeRuleReturnScope nonvoid_type_descriptor92 =null;
+
+		try {
+			// smaliTreeWalker.g:615:3: ( ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) )
+			// smaliTreeWalker.g:615:5: ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? )
+			{
+			match(input,I_LOCAL,FOLLOW_I_LOCAL_in_local1503); 
+			match(input, Token.DOWN, null); 
+			REGISTER91=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_local1505); 
+			// smaliTreeWalker.g:615:24: ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )?
+			int alt29=2;
+			int LA29_0 = input.LA(1);
+			if ( (LA29_0==NULL_LITERAL||LA29_0==STRING_LITERAL) ) {
+				alt29=1;
+			}
+			switch (alt29) {
+				case 1 :
+					// smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )?
+					{
+					// smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal )
+					int alt26=2;
+					int LA26_0 = input.LA(1);
+					if ( (LA26_0==NULL_LITERAL) ) {
+						alt26=1;
+					}
+					else if ( (LA26_0==STRING_LITERAL) ) {
+						alt26=2;
+					}
+
+					else {
+						NoViableAltException nvae =
+							new NoViableAltException("", 26, 0, input);
+						throw nvae;
+					}
+
+					switch (alt26) {
+						case 1 :
+							// smaliTreeWalker.g:615:26: NULL_LITERAL
+							{
+							match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local1509); 
+							}
+							break;
+						case 2 :
+							// smaliTreeWalker.g:615:41: name= string_literal
+							{
+							pushFollow(FOLLOW_string_literal_in_local1515);
+							name=string_literal();
+							state._fsp--;
+
+							}
+							break;
+
+					}
+
+					// smaliTreeWalker.g:615:62: ( nonvoid_type_descriptor )?
+					int alt27=2;
+					int LA27_0 = input.LA(1);
+					if ( (LA27_0==ARRAY_TYPE_PREFIX||LA27_0==CLASS_DESCRIPTOR||LA27_0==PRIMITIVE_TYPE) ) {
+						alt27=1;
+					}
+					switch (alt27) {
+						case 1 :
+							// smaliTreeWalker.g:615:62: nonvoid_type_descriptor
+							{
+							pushFollow(FOLLOW_nonvoid_type_descriptor_in_local1518);
+							nonvoid_type_descriptor92=nonvoid_type_descriptor();
+							state._fsp--;
+
+							}
+							break;
+
+					}
+
+					// smaliTreeWalker.g:615:96: (signature= string_literal )?
+					int alt28=2;
+					int LA28_0 = input.LA(1);
+					if ( (LA28_0==STRING_LITERAL) ) {
+						alt28=1;
+					}
+					switch (alt28) {
+						case 1 :
+							// smaliTreeWalker.g:615:96: signature= string_literal
+							{
+							pushFollow(FOLLOW_string_literal_in_local1523);
+							signature=string_literal();
+							state._fsp--;
+
+							}
+							break;
+
+					}
+
+					}
+					break;
+
+			}
+
+			match(input, Token.UP, null); 
+
+
+			      int registerNumber = parseRegister_short((REGISTER91!=null?REGISTER91.getText():null));
+			      method_stack.peek().methodBuilder.addStartLocal(registerNumber,
+			              dexBuilder.internNullableStringReference(name),
+			              dexBuilder.internNullableTypeReference((nonvoid_type_descriptor92!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor92).type:null)),
+			              dexBuilder.internNullableStringReference(signature));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "local"
+
+
+
+	// $ANTLR start "end_local"
+	// smaliTreeWalker.g:624:1: end_local : ^( I_END_LOCAL REGISTER ) ;
+	public final void end_local() throws RecognitionException {
+		CommonTree REGISTER93=null;
+
+		try {
+			// smaliTreeWalker.g:625:3: ( ^( I_END_LOCAL REGISTER ) )
+			// smaliTreeWalker.g:625:5: ^( I_END_LOCAL REGISTER )
+			{
+			match(input,I_END_LOCAL,FOLLOW_I_END_LOCAL_in_end_local1544); 
+			match(input, Token.DOWN, null); 
+			REGISTER93=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_end_local1546); 
+			match(input, Token.UP, null); 
+
+
+			      int registerNumber = parseRegister_short((REGISTER93!=null?REGISTER93.getText():null));
+			      method_stack.peek().methodBuilder.addEndLocal(registerNumber);
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "end_local"
+
+
+
+	// $ANTLR start "restart_local"
+	// smaliTreeWalker.g:631:1: restart_local : ^( I_RESTART_LOCAL REGISTER ) ;
+	public final void restart_local() throws RecognitionException {
+		CommonTree REGISTER94=null;
+
+		try {
+			// smaliTreeWalker.g:632:3: ( ^( I_RESTART_LOCAL REGISTER ) )
+			// smaliTreeWalker.g:632:5: ^( I_RESTART_LOCAL REGISTER )
+			{
+			match(input,I_RESTART_LOCAL,FOLLOW_I_RESTART_LOCAL_in_restart_local1564); 
+			match(input, Token.DOWN, null); 
+			REGISTER94=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local1566); 
+			match(input, Token.UP, null); 
+
+
+			      int registerNumber = parseRegister_short((REGISTER94!=null?REGISTER94.getText():null));
+			      method_stack.peek().methodBuilder.addRestartLocal(registerNumber);
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "restart_local"
+
+
+
+	// $ANTLR start "prologue"
+	// smaliTreeWalker.g:638:1: prologue : I_PROLOGUE ;
+	public final void prologue() throws RecognitionException {
+		try {
+			// smaliTreeWalker.g:639:3: ( I_PROLOGUE )
+			// smaliTreeWalker.g:639:5: I_PROLOGUE
+			{
+			match(input,I_PROLOGUE,FOLLOW_I_PROLOGUE_in_prologue1583); 
+
+			      method_stack.peek().methodBuilder.addPrologue();
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "prologue"
+
+
+
+	// $ANTLR start "epilogue"
+	// smaliTreeWalker.g:644:1: epilogue : I_EPILOGUE ;
+	public final void epilogue() throws RecognitionException {
+		try {
+			// smaliTreeWalker.g:645:3: ( I_EPILOGUE )
+			// smaliTreeWalker.g:645:5: I_EPILOGUE
+			{
+			match(input,I_EPILOGUE,FOLLOW_I_EPILOGUE_in_epilogue1599); 
+
+			      method_stack.peek().methodBuilder.addEpilogue();
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "epilogue"
+
+
+
+	// $ANTLR start "source"
+	// smaliTreeWalker.g:650:1: source : ^( I_SOURCE ( string_literal )? ) ;
+	public final void source() throws RecognitionException {
+		String string_literal95 =null;
+
+		try {
+			// smaliTreeWalker.g:651:3: ( ^( I_SOURCE ( string_literal )? ) )
+			// smaliTreeWalker.g:651:5: ^( I_SOURCE ( string_literal )? )
+			{
+			match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source1616); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:651:16: ( string_literal )?
+				int alt30=2;
+				int LA30_0 = input.LA(1);
+				if ( (LA30_0==STRING_LITERAL) ) {
+					alt30=1;
+				}
+				switch (alt30) {
+					case 1 :
+						// smaliTreeWalker.g:651:16: string_literal
+						{
+						pushFollow(FOLLOW_string_literal_in_source1618);
+						string_literal95=string_literal();
+						state._fsp--;
+
+						}
+						break;
+
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+
+			      method_stack.peek().methodBuilder.addSetSourceFile(dexBuilder.internNullableStringReference(string_literal95));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "source"
+
+
+
+	// $ANTLR start "ordered_method_items"
+	// smaliTreeWalker.g:656:1: ordered_method_items : ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) ;
+	public final void ordered_method_items() throws RecognitionException {
+		try {
+			// smaliTreeWalker.g:657:3: ( ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) )
+			// smaliTreeWalker.g:657:5: ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* )
+			{
+			match(input,I_ORDERED_METHOD_ITEMS,FOLLOW_I_ORDERED_METHOD_ITEMS_in_ordered_method_items1637); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:657:30: ( label_def | instruction | debug_directive )*
+				loop31:
+				while (true) {
+					int alt31=4;
+					switch ( input.LA(1) ) {
+					case I_LABEL:
+						{
+						alt31=1;
+						}
+						break;
+					case I_STATEMENT_ARRAY_DATA:
+					case I_STATEMENT_FORMAT10t:
+					case I_STATEMENT_FORMAT10x:
+					case I_STATEMENT_FORMAT11n:
+					case I_STATEMENT_FORMAT11x:
+					case I_STATEMENT_FORMAT12x:
+					case I_STATEMENT_FORMAT20bc:
+					case I_STATEMENT_FORMAT20t:
+					case I_STATEMENT_FORMAT21c_FIELD:
+					case I_STATEMENT_FORMAT21c_STRING:
+					case I_STATEMENT_FORMAT21c_TYPE:
+					case I_STATEMENT_FORMAT21ih:
+					case I_STATEMENT_FORMAT21lh:
+					case I_STATEMENT_FORMAT21s:
+					case I_STATEMENT_FORMAT21t:
+					case I_STATEMENT_FORMAT22b:
+					case I_STATEMENT_FORMAT22c_FIELD:
+					case I_STATEMENT_FORMAT22c_TYPE:
+					case I_STATEMENT_FORMAT22s:
+					case I_STATEMENT_FORMAT22t:
+					case I_STATEMENT_FORMAT22x:
+					case I_STATEMENT_FORMAT23x:
+					case I_STATEMENT_FORMAT30t:
+					case I_STATEMENT_FORMAT31c:
+					case I_STATEMENT_FORMAT31i:
+					case I_STATEMENT_FORMAT31t:
+					case I_STATEMENT_FORMAT32x:
+					case I_STATEMENT_FORMAT35c_METHOD:
+					case I_STATEMENT_FORMAT35c_TYPE:
+					case I_STATEMENT_FORMAT3rc_METHOD:
+					case I_STATEMENT_FORMAT3rc_TYPE:
+					case I_STATEMENT_FORMAT45cc_METHOD:
+					case I_STATEMENT_FORMAT4rcc_METHOD:
+					case I_STATEMENT_FORMAT51l:
+					case I_STATEMENT_PACKED_SWITCH:
+					case I_STATEMENT_SPARSE_SWITCH:
+						{
+						alt31=2;
+						}
+						break;
+					case I_END_LOCAL:
+					case I_EPILOGUE:
+					case I_LINE:
+					case I_LOCAL:
+					case I_PROLOGUE:
+					case I_RESTART_LOCAL:
+					case I_SOURCE:
+						{
+						alt31=3;
+						}
+						break;
+					}
+					switch (alt31) {
+					case 1 :
+						// smaliTreeWalker.g:657:31: label_def
+						{
+						pushFollow(FOLLOW_label_def_in_ordered_method_items1640);
+						label_def();
+						state._fsp--;
+
+						}
+						break;
+					case 2 :
+						// smaliTreeWalker.g:657:43: instruction
+						{
+						pushFollow(FOLLOW_instruction_in_ordered_method_items1644);
+						instruction();
+						state._fsp--;
+
+						}
+						break;
+					case 3 :
+						// smaliTreeWalker.g:657:57: debug_directive
+						{
+						pushFollow(FOLLOW_debug_directive_in_ordered_method_items1648);
+						debug_directive();
+						state._fsp--;
+
+						}
+						break;
+
+					default :
+						break loop31;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "ordered_method_items"
+
+
+
+	// $ANTLR start "label_ref"
+	// smaliTreeWalker.g:659:1: label_ref returns [Label label] : SIMPLE_NAME ;
+	public final Label label_ref() throws RecognitionException {
+		Label label = null;
+
+
+		CommonTree SIMPLE_NAME96=null;
+
+		try {
+			// smaliTreeWalker.g:660:3: ( SIMPLE_NAME )
+			// smaliTreeWalker.g:660:5: SIMPLE_NAME
+			{
+			SIMPLE_NAME96=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_ref1664); 
+			 label = method_stack.peek().methodBuilder.getLabel((SIMPLE_NAME96!=null?SIMPLE_NAME96.getText():null)); 
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return label;
+	}
+	// $ANTLR end "label_ref"
+
+
+	public static class register_list_return extends TreeRuleReturnScope {
+		public byte[] registers;
+		public byte registerCount;
+	};
+
+
+	// $ANTLR start "register_list"
+	// smaliTreeWalker.g:662:1: register_list returns [byte[] registers, byte registerCount] : ^( I_REGISTER_LIST ( REGISTER )* ) ;
+	public final smaliTreeWalker.register_list_return register_list() throws RecognitionException {
+		smaliTreeWalker.register_list_return retval = new smaliTreeWalker.register_list_return();
+		retval.start = input.LT(1);
+
+		CommonTree I_REGISTER_LIST97=null;
+		CommonTree REGISTER98=null;
+
+
+		    retval.registers = new byte[5];
+		    retval.registerCount = 0;
+		  
+		try {
+			// smaliTreeWalker.g:668:3: ( ^( I_REGISTER_LIST ( REGISTER )* ) )
+			// smaliTreeWalker.g:668:5: ^( I_REGISTER_LIST ( REGISTER )* )
+			{
+			I_REGISTER_LIST97=(CommonTree)match(input,I_REGISTER_LIST,FOLLOW_I_REGISTER_LIST_in_register_list1689); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:669:7: ( REGISTER )*
+				loop32:
+				while (true) {
+					int alt32=2;
+					int LA32_0 = input.LA(1);
+					if ( (LA32_0==REGISTER) ) {
+						alt32=1;
+					}
+
+					switch (alt32) {
+					case 1 :
+						// smaliTreeWalker.g:669:8: REGISTER
+						{
+						REGISTER98=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_list1698); 
+
+						        if (retval.registerCount == 5) {
+						          throw new SemanticException(input, I_REGISTER_LIST97, "A list of registers can only have a maximum of 5 " +
+						                  "registers. Use the <op>/range alternate opcode instead.");
+						        }
+						        retval.registers[retval.registerCount++] = parseRegister_nibble((REGISTER98!=null?REGISTER98.getText():null));
+						      
+						}
+						break;
+
+					default :
+						break loop32;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "register_list"
+
+
+	public static class register_range_return extends TreeRuleReturnScope {
+		public int startRegister;
+		public int endRegister;
+	};
+
+
+	// $ANTLR start "register_range"
+	// smaliTreeWalker.g:678:1: register_range returns [int startRegister, int endRegister] : ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) ;
+	public final smaliTreeWalker.register_range_return register_range() throws RecognitionException {
+		smaliTreeWalker.register_range_return retval = new smaliTreeWalker.register_range_return();
+		retval.start = input.LT(1);
+
+		CommonTree startReg=null;
+		CommonTree endReg=null;
+		CommonTree I_REGISTER_RANGE99=null;
+
+		try {
+			// smaliTreeWalker.g:679:3: ( ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) )
+			// smaliTreeWalker.g:679:5: ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? )
+			{
+			I_REGISTER_RANGE99=(CommonTree)match(input,I_REGISTER_RANGE,FOLLOW_I_REGISTER_RANGE_in_register_range1723); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:679:24: (startReg= REGISTER (endReg= REGISTER )? )?
+				int alt34=2;
+				int LA34_0 = input.LA(1);
+				if ( (LA34_0==REGISTER) ) {
+					alt34=1;
+				}
+				switch (alt34) {
+					case 1 :
+						// smaliTreeWalker.g:679:25: startReg= REGISTER (endReg= REGISTER )?
+						{
+						startReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1728); 
+						// smaliTreeWalker.g:679:49: (endReg= REGISTER )?
+						int alt33=2;
+						int LA33_0 = input.LA(1);
+						if ( (LA33_0==REGISTER) ) {
+							alt33=1;
+						}
+						switch (alt33) {
+							case 1 :
+								// smaliTreeWalker.g:679:49: endReg= REGISTER
+								{
+								endReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1732); 
+								}
+								break;
+
+						}
+
+						}
+						break;
+
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+
+			        if (startReg == null) {
+			            retval.startRegister = 0;
+			            retval.endRegister = -1;
+			        } else {
+			                retval.startRegister = parseRegister_short((startReg!=null?startReg.getText():null));
+			                if (endReg == null) {
+			                    retval.endRegister = retval.startRegister;
+			                } else {
+			                    retval.endRegister = parseRegister_short((endReg!=null?endReg.getText():null));
+			                }
+
+			                int registerCount = retval.endRegister-retval.startRegister+1;
+			                if (registerCount < 1) {
+			                    throw new SemanticException(input, I_REGISTER_RANGE99, "A register range must have the lower register listed first");
+			                }
+			            }
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "register_range"
+
+
+
+	// $ANTLR start "verification_error_reference"
+	// smaliTreeWalker.g:699:1: verification_error_reference returns [ImmutableReference reference] : ( CLASS_DESCRIPTOR | field_reference | method_reference );
+	public final ImmutableReference verification_error_reference() throws RecognitionException {
+		ImmutableReference reference = null;
+
+
+		CommonTree CLASS_DESCRIPTOR100=null;
+		ImmutableFieldReference field_reference101 =null;
+		ImmutableMethodReference method_reference102 =null;
+
+		try {
+			// smaliTreeWalker.g:700:3: ( CLASS_DESCRIPTOR | field_reference | method_reference )
+			int alt35=3;
+			switch ( input.LA(1) ) {
+			case CLASS_DESCRIPTOR:
+				{
+				int LA35_1 = input.LA(2);
+				if ( (LA35_1==UP) ) {
+					alt35=1;
+				}
+				else if ( (LA35_1==SIMPLE_NAME) ) {
+					int LA35_3 = input.LA(3);
+					if ( (LA35_3==ARRAY_TYPE_PREFIX||LA35_3==CLASS_DESCRIPTOR||LA35_3==PRIMITIVE_TYPE) ) {
+						alt35=2;
+					}
+					else if ( (LA35_3==I_METHOD_PROTOTYPE) ) {
+						alt35=3;
+					}
+
+					else {
+						int nvaeMark = input.mark();
+						try {
+							for (int nvaeConsume = 0; nvaeConsume < 3 - 1; nvaeConsume++) {
+								input.consume();
+							}
+							NoViableAltException nvae =
+								new NoViableAltException("", 35, 3, input);
+							throw nvae;
+						} finally {
+							input.rewind(nvaeMark);
+						}
+					}
+
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 35, 1, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case ARRAY_TYPE_PREFIX:
+				{
+				int LA35_2 = input.LA(2);
+				if ( (LA35_2==PRIMITIVE_TYPE) ) {
+					int LA35_5 = input.LA(3);
+					if ( (LA35_5==SIMPLE_NAME) ) {
+						int LA35_3 = input.LA(4);
+						if ( (LA35_3==ARRAY_TYPE_PREFIX||LA35_3==CLASS_DESCRIPTOR||LA35_3==PRIMITIVE_TYPE) ) {
+							alt35=2;
+						}
+						else if ( (LA35_3==I_METHOD_PROTOTYPE) ) {
+							alt35=3;
+						}
+
+						else {
+							int nvaeMark = input.mark();
+							try {
+								for (int nvaeConsume = 0; nvaeConsume < 4 - 1; nvaeConsume++) {
+									input.consume();
+								}
+								NoViableAltException nvae =
+									new NoViableAltException("", 35, 3, input);
+								throw nvae;
+							} finally {
+								input.rewind(nvaeMark);
+							}
+						}
+
+					}
+
+					else {
+						int nvaeMark = input.mark();
+						try {
+							for (int nvaeConsume = 0; nvaeConsume < 3 - 1; nvaeConsume++) {
+								input.consume();
+							}
+							NoViableAltException nvae =
+								new NoViableAltException("", 35, 5, input);
+							throw nvae;
+						} finally {
+							input.rewind(nvaeMark);
+						}
+					}
+
+				}
+				else if ( (LA35_2==CLASS_DESCRIPTOR) ) {
+					int LA35_6 = input.LA(3);
+					if ( (LA35_6==SIMPLE_NAME) ) {
+						int LA35_3 = input.LA(4);
+						if ( (LA35_3==ARRAY_TYPE_PREFIX||LA35_3==CLASS_DESCRIPTOR||LA35_3==PRIMITIVE_TYPE) ) {
+							alt35=2;
+						}
+						else if ( (LA35_3==I_METHOD_PROTOTYPE) ) {
+							alt35=3;
+						}
+
+						else {
+							int nvaeMark = input.mark();
+							try {
+								for (int nvaeConsume = 0; nvaeConsume < 4 - 1; nvaeConsume++) {
+									input.consume();
+								}
+								NoViableAltException nvae =
+									new NoViableAltException("", 35, 3, input);
+								throw nvae;
+							} finally {
+								input.rewind(nvaeMark);
+							}
+						}
+
+					}
+
+					else {
+						int nvaeMark = input.mark();
+						try {
+							for (int nvaeConsume = 0; nvaeConsume < 3 - 1; nvaeConsume++) {
+								input.consume();
+							}
+							NoViableAltException nvae =
+								new NoViableAltException("", 35, 6, input);
+							throw nvae;
+						} finally {
+							input.rewind(nvaeMark);
+						}
+					}
+
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 35, 2, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			case SIMPLE_NAME:
+				{
+				int LA35_3 = input.LA(2);
+				if ( (LA35_3==ARRAY_TYPE_PREFIX||LA35_3==CLASS_DESCRIPTOR||LA35_3==PRIMITIVE_TYPE) ) {
+					alt35=2;
+				}
+				else if ( (LA35_3==I_METHOD_PROTOTYPE) ) {
+					alt35=3;
+				}
+
+				else {
+					int nvaeMark = input.mark();
+					try {
+						input.consume();
+						NoViableAltException nvae =
+							new NoViableAltException("", 35, 3, input);
+						throw nvae;
+					} finally {
+						input.rewind(nvaeMark);
+					}
+				}
+
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 35, 0, input);
+				throw nvae;
+			}
+			switch (alt35) {
+				case 1 :
+					// smaliTreeWalker.g:700:5: CLASS_DESCRIPTOR
+					{
+					CLASS_DESCRIPTOR100=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference1755); 
+
+					    reference = new ImmutableTypeReference((CLASS_DESCRIPTOR100!=null?CLASS_DESCRIPTOR100.getText():null));
+					  
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:704:5: field_reference
+					{
+					pushFollow(FOLLOW_field_reference_in_verification_error_reference1765);
+					field_reference101=field_reference();
+					state._fsp--;
+
+
+					    reference = field_reference101;
+					  
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:708:5: method_reference
+					{
+					pushFollow(FOLLOW_method_reference_in_verification_error_reference1775);
+					method_reference102=method_reference();
+					state._fsp--;
+
+
+					    reference = method_reference102;
+					  
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return reference;
+	}
+	// $ANTLR end "verification_error_reference"
+
+
+
+	// $ANTLR start "verification_error_type"
+	// smaliTreeWalker.g:713:1: verification_error_type returns [int verificationError] : VERIFICATION_ERROR_TYPE ;
+	public final int verification_error_type() throws RecognitionException {
+		int verificationError = 0;
+
+
+		CommonTree VERIFICATION_ERROR_TYPE103=null;
+
+		try {
+			// smaliTreeWalker.g:714:3: ( VERIFICATION_ERROR_TYPE )
+			// smaliTreeWalker.g:714:5: VERIFICATION_ERROR_TYPE
+			{
+			VERIFICATION_ERROR_TYPE103=(CommonTree)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_verification_error_type1792); 
+
+			    verificationError = VerificationError.getVerificationError((VERIFICATION_ERROR_TYPE103!=null?VERIFICATION_ERROR_TYPE103.getText():null));
+			  
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return verificationError;
+	}
+	// $ANTLR end "verification_error_type"
+
+
+	public static class instruction_return extends TreeRuleReturnScope {
+	};
+
+
+	// $ANTLR start "instruction"
+	// smaliTreeWalker.g:719:1: instruction : ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive );
+	public final smaliTreeWalker.instruction_return instruction() throws RecognitionException {
+		smaliTreeWalker.instruction_return retval = new smaliTreeWalker.instruction_return();
+		retval.start = input.LT(1);
+
+		try {
+			// smaliTreeWalker.g:720:3: ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive )
+			int alt36=36;
+			switch ( input.LA(1) ) {
+			case I_STATEMENT_FORMAT10t:
+				{
+				alt36=1;
+				}
+				break;
+			case I_STATEMENT_FORMAT10x:
+				{
+				alt36=2;
+				}
+				break;
+			case I_STATEMENT_FORMAT11n:
+				{
+				alt36=3;
+				}
+				break;
+			case I_STATEMENT_FORMAT11x:
+				{
+				alt36=4;
+				}
+				break;
+			case I_STATEMENT_FORMAT12x:
+				{
+				alt36=5;
+				}
+				break;
+			case I_STATEMENT_FORMAT20bc:
+				{
+				alt36=6;
+				}
+				break;
+			case I_STATEMENT_FORMAT20t:
+				{
+				alt36=7;
+				}
+				break;
+			case I_STATEMENT_FORMAT21c_FIELD:
+				{
+				alt36=8;
+				}
+				break;
+			case I_STATEMENT_FORMAT21c_STRING:
+				{
+				alt36=9;
+				}
+				break;
+			case I_STATEMENT_FORMAT21c_TYPE:
+				{
+				alt36=10;
+				}
+				break;
+			case I_STATEMENT_FORMAT21ih:
+				{
+				alt36=11;
+				}
+				break;
+			case I_STATEMENT_FORMAT21lh:
+				{
+				alt36=12;
+				}
+				break;
+			case I_STATEMENT_FORMAT21s:
+				{
+				alt36=13;
+				}
+				break;
+			case I_STATEMENT_FORMAT21t:
+				{
+				alt36=14;
+				}
+				break;
+			case I_STATEMENT_FORMAT22b:
+				{
+				alt36=15;
+				}
+				break;
+			case I_STATEMENT_FORMAT22c_FIELD:
+				{
+				alt36=16;
+				}
+				break;
+			case I_STATEMENT_FORMAT22c_TYPE:
+				{
+				alt36=17;
+				}
+				break;
+			case I_STATEMENT_FORMAT22s:
+				{
+				alt36=18;
+				}
+				break;
+			case I_STATEMENT_FORMAT22t:
+				{
+				alt36=19;
+				}
+				break;
+			case I_STATEMENT_FORMAT22x:
+				{
+				alt36=20;
+				}
+				break;
+			case I_STATEMENT_FORMAT23x:
+				{
+				alt36=21;
+				}
+				break;
+			case I_STATEMENT_FORMAT30t:
+				{
+				alt36=22;
+				}
+				break;
+			case I_STATEMENT_FORMAT31c:
+				{
+				alt36=23;
+				}
+				break;
+			case I_STATEMENT_FORMAT31i:
+				{
+				alt36=24;
+				}
+				break;
+			case I_STATEMENT_FORMAT31t:
+				{
+				alt36=25;
+				}
+				break;
+			case I_STATEMENT_FORMAT32x:
+				{
+				alt36=26;
+				}
+				break;
+			case I_STATEMENT_FORMAT35c_METHOD:
+				{
+				alt36=27;
+				}
+				break;
+			case I_STATEMENT_FORMAT35c_TYPE:
+				{
+				alt36=28;
+				}
+				break;
+			case I_STATEMENT_FORMAT3rc_METHOD:
+				{
+				alt36=29;
+				}
+				break;
+			case I_STATEMENT_FORMAT3rc_TYPE:
+				{
+				alt36=30;
+				}
+				break;
+			case I_STATEMENT_FORMAT45cc_METHOD:
+				{
+				alt36=31;
+				}
+				break;
+			case I_STATEMENT_FORMAT4rcc_METHOD:
+				{
+				alt36=32;
+				}
+				break;
+			case I_STATEMENT_FORMAT51l:
+				{
+				alt36=33;
+				}
+				break;
+			case I_STATEMENT_ARRAY_DATA:
+				{
+				alt36=34;
+				}
+				break;
+			case I_STATEMENT_PACKED_SWITCH:
+				{
+				alt36=35;
+				}
+				break;
+			case I_STATEMENT_SPARSE_SWITCH:
+				{
+				alt36=36;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 36, 0, input);
+				throw nvae;
+			}
+			switch (alt36) {
+				case 1 :
+					// smaliTreeWalker.g:720:5: insn_format10t
+					{
+					pushFollow(FOLLOW_insn_format10t_in_instruction1806);
+					insn_format10t();
+					state._fsp--;
+
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:721:5: insn_format10x
+					{
+					pushFollow(FOLLOW_insn_format10x_in_instruction1812);
+					insn_format10x();
+					state._fsp--;
+
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:722:5: insn_format11n
+					{
+					pushFollow(FOLLOW_insn_format11n_in_instruction1818);
+					insn_format11n();
+					state._fsp--;
+
+					}
+					break;
+				case 4 :
+					// smaliTreeWalker.g:723:5: insn_format11x
+					{
+					pushFollow(FOLLOW_insn_format11x_in_instruction1824);
+					insn_format11x();
+					state._fsp--;
+
+					}
+					break;
+				case 5 :
+					// smaliTreeWalker.g:724:5: insn_format12x
+					{
+					pushFollow(FOLLOW_insn_format12x_in_instruction1830);
+					insn_format12x();
+					state._fsp--;
+
+					}
+					break;
+				case 6 :
+					// smaliTreeWalker.g:725:5: insn_format20bc
+					{
+					pushFollow(FOLLOW_insn_format20bc_in_instruction1836);
+					insn_format20bc();
+					state._fsp--;
+
+					}
+					break;
+				case 7 :
+					// smaliTreeWalker.g:726:5: insn_format20t
+					{
+					pushFollow(FOLLOW_insn_format20t_in_instruction1842);
+					insn_format20t();
+					state._fsp--;
+
+					}
+					break;
+				case 8 :
+					// smaliTreeWalker.g:727:5: insn_format21c_field
+					{
+					pushFollow(FOLLOW_insn_format21c_field_in_instruction1848);
+					insn_format21c_field();
+					state._fsp--;
+
+					}
+					break;
+				case 9 :
+					// smaliTreeWalker.g:728:5: insn_format21c_string
+					{
+					pushFollow(FOLLOW_insn_format21c_string_in_instruction1854);
+					insn_format21c_string();
+					state._fsp--;
+
+					}
+					break;
+				case 10 :
+					// smaliTreeWalker.g:729:5: insn_format21c_type
+					{
+					pushFollow(FOLLOW_insn_format21c_type_in_instruction1860);
+					insn_format21c_type();
+					state._fsp--;
+
+					}
+					break;
+				case 11 :
+					// smaliTreeWalker.g:730:5: insn_format21ih
+					{
+					pushFollow(FOLLOW_insn_format21ih_in_instruction1866);
+					insn_format21ih();
+					state._fsp--;
+
+					}
+					break;
+				case 12 :
+					// smaliTreeWalker.g:731:5: insn_format21lh
+					{
+					pushFollow(FOLLOW_insn_format21lh_in_instruction1872);
+					insn_format21lh();
+					state._fsp--;
+
+					}
+					break;
+				case 13 :
+					// smaliTreeWalker.g:732:5: insn_format21s
+					{
+					pushFollow(FOLLOW_insn_format21s_in_instruction1878);
+					insn_format21s();
+					state._fsp--;
+
+					}
+					break;
+				case 14 :
+					// smaliTreeWalker.g:733:5: insn_format21t
+					{
+					pushFollow(FOLLOW_insn_format21t_in_instruction1884);
+					insn_format21t();
+					state._fsp--;
+
+					}
+					break;
+				case 15 :
+					// smaliTreeWalker.g:734:5: insn_format22b
+					{
+					pushFollow(FOLLOW_insn_format22b_in_instruction1890);
+					insn_format22b();
+					state._fsp--;
+
+					}
+					break;
+				case 16 :
+					// smaliTreeWalker.g:735:5: insn_format22c_field
+					{
+					pushFollow(FOLLOW_insn_format22c_field_in_instruction1896);
+					insn_format22c_field();
+					state._fsp--;
+
+					}
+					break;
+				case 17 :
+					// smaliTreeWalker.g:736:5: insn_format22c_type
+					{
+					pushFollow(FOLLOW_insn_format22c_type_in_instruction1902);
+					insn_format22c_type();
+					state._fsp--;
+
+					}
+					break;
+				case 18 :
+					// smaliTreeWalker.g:737:5: insn_format22s
+					{
+					pushFollow(FOLLOW_insn_format22s_in_instruction1908);
+					insn_format22s();
+					state._fsp--;
+
+					}
+					break;
+				case 19 :
+					// smaliTreeWalker.g:738:5: insn_format22t
+					{
+					pushFollow(FOLLOW_insn_format22t_in_instruction1914);
+					insn_format22t();
+					state._fsp--;
+
+					}
+					break;
+				case 20 :
+					// smaliTreeWalker.g:739:5: insn_format22x
+					{
+					pushFollow(FOLLOW_insn_format22x_in_instruction1920);
+					insn_format22x();
+					state._fsp--;
+
+					}
+					break;
+				case 21 :
+					// smaliTreeWalker.g:740:5: insn_format23x
+					{
+					pushFollow(FOLLOW_insn_format23x_in_instruction1926);
+					insn_format23x();
+					state._fsp--;
+
+					}
+					break;
+				case 22 :
+					// smaliTreeWalker.g:741:5: insn_format30t
+					{
+					pushFollow(FOLLOW_insn_format30t_in_instruction1932);
+					insn_format30t();
+					state._fsp--;
+
+					}
+					break;
+				case 23 :
+					// smaliTreeWalker.g:742:5: insn_format31c
+					{
+					pushFollow(FOLLOW_insn_format31c_in_instruction1938);
+					insn_format31c();
+					state._fsp--;
+
+					}
+					break;
+				case 24 :
+					// smaliTreeWalker.g:743:5: insn_format31i
+					{
+					pushFollow(FOLLOW_insn_format31i_in_instruction1944);
+					insn_format31i();
+					state._fsp--;
+
+					}
+					break;
+				case 25 :
+					// smaliTreeWalker.g:744:5: insn_format31t
+					{
+					pushFollow(FOLLOW_insn_format31t_in_instruction1950);
+					insn_format31t();
+					state._fsp--;
+
+					}
+					break;
+				case 26 :
+					// smaliTreeWalker.g:745:5: insn_format32x
+					{
+					pushFollow(FOLLOW_insn_format32x_in_instruction1956);
+					insn_format32x();
+					state._fsp--;
+
+					}
+					break;
+				case 27 :
+					// smaliTreeWalker.g:746:5: insn_format35c_method
+					{
+					pushFollow(FOLLOW_insn_format35c_method_in_instruction1962);
+					insn_format35c_method();
+					state._fsp--;
+
+					}
+					break;
+				case 28 :
+					// smaliTreeWalker.g:747:5: insn_format35c_type
+					{
+					pushFollow(FOLLOW_insn_format35c_type_in_instruction1968);
+					insn_format35c_type();
+					state._fsp--;
+
+					}
+					break;
+				case 29 :
+					// smaliTreeWalker.g:748:5: insn_format3rc_method
+					{
+					pushFollow(FOLLOW_insn_format3rc_method_in_instruction1974);
+					insn_format3rc_method();
+					state._fsp--;
+
+					}
+					break;
+				case 30 :
+					// smaliTreeWalker.g:749:5: insn_format3rc_type
+					{
+					pushFollow(FOLLOW_insn_format3rc_type_in_instruction1980);
+					insn_format3rc_type();
+					state._fsp--;
+
+					}
+					break;
+				case 31 :
+					// smaliTreeWalker.g:750:5: insn_format45cc_method
+					{
+					pushFollow(FOLLOW_insn_format45cc_method_in_instruction1986);
+					insn_format45cc_method();
+					state._fsp--;
+
+					}
+					break;
+				case 32 :
+					// smaliTreeWalker.g:751:5: insn_format4rcc_method
+					{
+					pushFollow(FOLLOW_insn_format4rcc_method_in_instruction1992);
+					insn_format4rcc_method();
+					state._fsp--;
+
+					}
+					break;
+				case 33 :
+					// smaliTreeWalker.g:752:5: insn_format51l_type
+					{
+					pushFollow(FOLLOW_insn_format51l_type_in_instruction1998);
+					insn_format51l_type();
+					state._fsp--;
+
+					}
+					break;
+				case 34 :
+					// smaliTreeWalker.g:753:5: insn_array_data_directive
+					{
+					pushFollow(FOLLOW_insn_array_data_directive_in_instruction2004);
+					insn_array_data_directive();
+					state._fsp--;
+
+					}
+					break;
+				case 35 :
+					// smaliTreeWalker.g:754:5: insn_packed_switch_directive
+					{
+					pushFollow(FOLLOW_insn_packed_switch_directive_in_instruction2010);
+					insn_packed_switch_directive();
+					state._fsp--;
+
+					}
+					break;
+				case 36 :
+					// smaliTreeWalker.g:755:5: insn_sparse_switch_directive
+					{
+					pushFollow(FOLLOW_insn_sparse_switch_directive_in_instruction2016);
+					insn_sparse_switch_directive();
+					state._fsp--;
+
+					}
+					break;
+
+			}
+		}
+		catch (Exception ex) {
+
+			    reportError(new SemanticException(input, ((CommonTree)retval.start), ex.getMessage()));
+			    recover(input, null);
+			  
+		}
+
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "instruction"
+
+
+
+	// $ANTLR start "insn_format10t"
+	// smaliTreeWalker.g:761:1: insn_format10t : ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) ;
+	public final void insn_format10t() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT10t104=null;
+		Label label_ref105 =null;
+
+		try {
+			// smaliTreeWalker.g:762:3: ( ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) )
+			// smaliTreeWalker.g:763:5: ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref )
+			{
+			match(input,I_STATEMENT_FORMAT10t,FOLLOW_I_STATEMENT_FORMAT10t_in_insn_format10t2040); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT10t104=(CommonTree)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t2042); 
+			pushFollow(FOLLOW_label_ref_in_insn_format10t2044);
+			label_ref105=label_ref();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT10t104!=null?INSTRUCTION_FORMAT10t104.getText():null));
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction10t(opcode, label_ref105));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format10t"
+
+
+
+	// $ANTLR start "insn_format10x"
+	// smaliTreeWalker.g:769:1: insn_format10x : ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) ;
+	public final void insn_format10x() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT10x106=null;
+
+		try {
+			// smaliTreeWalker.g:770:3: ( ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) )
+			// smaliTreeWalker.g:771:5: ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x )
+			{
+			match(input,I_STATEMENT_FORMAT10x,FOLLOW_I_STATEMENT_FORMAT10x_in_insn_format10x2067); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT10x106=(CommonTree)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x2069); 
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT10x106!=null?INSTRUCTION_FORMAT10x106.getText():null));
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction10x(opcode));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format10x"
+
+
+
+	// $ANTLR start "insn_format11n"
+	// smaliTreeWalker.g:777:1: insn_format11n : ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) ;
+	public final void insn_format11n() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT11n107=null;
+		CommonTree REGISTER108=null;
+		short short_integral_literal109 =0;
+
+		try {
+			// smaliTreeWalker.g:778:3: ( ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) )
+			// smaliTreeWalker.g:779:5: ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal )
+			{
+			match(input,I_STATEMENT_FORMAT11n,FOLLOW_I_STATEMENT_FORMAT11n_in_insn_format11n2092); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT11n107=(CommonTree)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n2094); 
+			REGISTER108=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n2096); 
+			pushFollow(FOLLOW_short_integral_literal_in_insn_format11n2098);
+			short_integral_literal109=short_integral_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT11n107!=null?INSTRUCTION_FORMAT11n107.getText():null));
+			      byte regA = parseRegister_nibble((REGISTER108!=null?REGISTER108.getText():null));
+
+			      short litB = short_integral_literal109;
+			      LiteralTools.checkNibble(litB);
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction11n(opcode, regA, litB));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format11n"
+
+
+
+	// $ANTLR start "insn_format11x"
+	// smaliTreeWalker.g:790:1: insn_format11x : ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) ;
+	public final void insn_format11x() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT11x110=null;
+		CommonTree REGISTER111=null;
+
+		try {
+			// smaliTreeWalker.g:791:3: ( ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) )
+			// smaliTreeWalker.g:792:5: ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER )
+			{
+			match(input,I_STATEMENT_FORMAT11x,FOLLOW_I_STATEMENT_FORMAT11x_in_insn_format11x2121); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT11x110=(CommonTree)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x2123); 
+			REGISTER111=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x2125); 
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT11x110!=null?INSTRUCTION_FORMAT11x110.getText():null));
+			      short regA = parseRegister_byte((REGISTER111!=null?REGISTER111.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction11x(opcode, regA));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format11x"
+
+
+
+	// $ANTLR start "insn_format12x"
+	// smaliTreeWalker.g:800:1: insn_format12x : ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) ;
+	public final void insn_format12x() throws RecognitionException {
+		CommonTree registerA=null;
+		CommonTree registerB=null;
+		CommonTree INSTRUCTION_FORMAT12x112=null;
+
+		try {
+			// smaliTreeWalker.g:801:3: ( ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) )
+			// smaliTreeWalker.g:802:5: ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER )
+			{
+			match(input,I_STATEMENT_FORMAT12x,FOLLOW_I_STATEMENT_FORMAT12x_in_insn_format12x2148); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT12x112=(CommonTree)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_insn_format12x2150); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2154); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2158); 
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT12x112!=null?INSTRUCTION_FORMAT12x112.getText():null));
+			      byte regA = parseRegister_nibble((registerA!=null?registerA.getText():null));
+			      byte regB = parseRegister_nibble((registerB!=null?registerB.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction12x(opcode, regA, regB));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format12x"
+
+
+
+	// $ANTLR start "insn_format20bc"
+	// smaliTreeWalker.g:811:1: insn_format20bc : ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) ;
+	public final void insn_format20bc() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT20bc113=null;
+		int verification_error_type114 =0;
+		ImmutableReference verification_error_reference115 =null;
+
+		try {
+			// smaliTreeWalker.g:812:3: ( ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) )
+			// smaliTreeWalker.g:813:5: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference )
+			{
+			match(input,I_STATEMENT_FORMAT20bc,FOLLOW_I_STATEMENT_FORMAT20bc_in_insn_format20bc2181); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT20bc113=(CommonTree)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc2183); 
+			pushFollow(FOLLOW_verification_error_type_in_insn_format20bc2185);
+			verification_error_type114=verification_error_type();
+			state._fsp--;
+
+			pushFollow(FOLLOW_verification_error_reference_in_insn_format20bc2187);
+			verification_error_reference115=verification_error_reference();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT20bc113!=null?INSTRUCTION_FORMAT20bc113.getText():null));
+
+			      int verificationError = verification_error_type114;
+			      ImmutableReference referencedItem = verification_error_reference115;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction20bc(opcode, verificationError,
+			              dexBuilder.internReference(referencedItem)));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format20bc"
+
+
+
+	// $ANTLR start "insn_format20t"
+	// smaliTreeWalker.g:824:1: insn_format20t : ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) ;
+	public final void insn_format20t() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT20t116=null;
+		Label label_ref117 =null;
+
+		try {
+			// smaliTreeWalker.g:825:3: ( ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) )
+			// smaliTreeWalker.g:826:5: ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref )
+			{
+			match(input,I_STATEMENT_FORMAT20t,FOLLOW_I_STATEMENT_FORMAT20t_in_insn_format20t2210); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT20t116=(CommonTree)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t2212); 
+			pushFollow(FOLLOW_label_ref_in_insn_format20t2214);
+			label_ref117=label_ref();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT20t116!=null?INSTRUCTION_FORMAT20t116.getText():null));
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction20t(opcode, label_ref117));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format20t"
+
+
+
+	// $ANTLR start "insn_format21c_field"
+	// smaliTreeWalker.g:832:1: insn_format21c_field : ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) ;
+	public final void insn_format21c_field() throws RecognitionException {
+		CommonTree inst=null;
+		CommonTree REGISTER118=null;
+		ImmutableFieldReference field_reference119 =null;
+
+		try {
+			// smaliTreeWalker.g:833:3: ( ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) )
+			// smaliTreeWalker.g:834:5: ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference )
+			{
+			match(input,I_STATEMENT_FORMAT21c_FIELD,FOLLOW_I_STATEMENT_FORMAT21c_FIELD_in_insn_format21c_field2237); 
+			match(input, Token.DOWN, null); 
+			inst=(CommonTree)input.LT(1);
+			if ( (input.LA(1) >= INSTRUCTION_FORMAT21c_FIELD && input.LA(1) <= INSTRUCTION_FORMAT21c_FIELD_ODEX) ) {
+				input.consume();
+				state.errorRecovery=false;
+			}
+			else {
+				MismatchedSetException mse = new MismatchedSetException(null,input);
+				throw mse;
+			}
+			REGISTER118=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field2249); 
+			pushFollow(FOLLOW_field_reference_in_insn_format21c_field2251);
+			field_reference119=field_reference();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((inst!=null?inst.getText():null));
+			      short regA = parseRegister_byte((REGISTER118!=null?REGISTER118.getText():null));
+
+			      ImmutableFieldReference fieldReference = field_reference119;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
+			              dexBuilder.internFieldReference(fieldReference)));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format21c_field"
+
+
+
+	// $ANTLR start "insn_format21c_string"
+	// smaliTreeWalker.g:845:1: insn_format21c_string : ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) ;
+	public final void insn_format21c_string() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT21c_STRING120=null;
+		CommonTree REGISTER121=null;
+		String string_literal122 =null;
+
+		try {
+			// smaliTreeWalker.g:846:3: ( ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) )
+			// smaliTreeWalker.g:847:5: ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal )
+			{
+			match(input,I_STATEMENT_FORMAT21c_STRING,FOLLOW_I_STATEMENT_FORMAT21c_STRING_in_insn_format21c_string2274); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21c_STRING120=(CommonTree)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string2276); 
+			REGISTER121=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string2278); 
+			pushFollow(FOLLOW_string_literal_in_insn_format21c_string2280);
+			string_literal122=string_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21c_STRING120!=null?INSTRUCTION_FORMAT21c_STRING120.getText():null));
+			      short regA = parseRegister_byte((REGISTER121!=null?REGISTER121.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
+			              dexBuilder.internStringReference(string_literal122)));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format21c_string"
+
+
+
+	// $ANTLR start "insn_format21c_type"
+	// smaliTreeWalker.g:856:1: insn_format21c_type : ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ;
+	public final void insn_format21c_type() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT21c_TYPE123=null;
+		CommonTree REGISTER124=null;
+		TreeRuleReturnScope nonvoid_type_descriptor125 =null;
+
+		try {
+			// smaliTreeWalker.g:857:3: ( ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) )
+			// smaliTreeWalker.g:858:5: ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor )
+			{
+			match(input,I_STATEMENT_FORMAT21c_TYPE,FOLLOW_I_STATEMENT_FORMAT21c_TYPE_in_insn_format21c_type2303); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21c_TYPE123=(CommonTree)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type2305); 
+			REGISTER124=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type2307); 
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format21c_type2309);
+			nonvoid_type_descriptor125=nonvoid_type_descriptor();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21c_TYPE123!=null?INSTRUCTION_FORMAT21c_TYPE123.getText():null));
+			      short regA = parseRegister_byte((REGISTER124!=null?REGISTER124.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
+			              dexBuilder.internTypeReference((nonvoid_type_descriptor125!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor125).type:null))));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format21c_type"
+
+
+
+	// $ANTLR start "insn_format21ih"
+	// smaliTreeWalker.g:867:1: insn_format21ih : ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ;
+	public final void insn_format21ih() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT21ih126=null;
+		CommonTree REGISTER127=null;
+		int fixed_32bit_literal128 =0;
+
+		try {
+			// smaliTreeWalker.g:868:3: ( ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) )
+			// smaliTreeWalker.g:869:5: ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal )
+			{
+			match(input,I_STATEMENT_FORMAT21ih,FOLLOW_I_STATEMENT_FORMAT21ih_in_insn_format21ih2332); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21ih126=(CommonTree)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih2334); 
+			REGISTER127=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih2336); 
+			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format21ih2338);
+			fixed_32bit_literal128=fixed_32bit_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21ih126!=null?INSTRUCTION_FORMAT21ih126.getText():null));
+			      short regA = parseRegister_byte((REGISTER127!=null?REGISTER127.getText():null));
+
+			      int litB = fixed_32bit_literal128;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21ih(opcode, regA, litB));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format21ih"
+
+
+
+	// $ANTLR start "insn_format21lh"
+	// smaliTreeWalker.g:879:1: insn_format21lh : ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) ;
+	public final void insn_format21lh() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT21lh129=null;
+		CommonTree REGISTER130=null;
+		long fixed_64bit_literal131 =0;
+
+		try {
+			// smaliTreeWalker.g:880:3: ( ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) )
+			// smaliTreeWalker.g:881:5: ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal )
+			{
+			match(input,I_STATEMENT_FORMAT21lh,FOLLOW_I_STATEMENT_FORMAT21lh_in_insn_format21lh2361); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21lh129=(CommonTree)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh2363); 
+			REGISTER130=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh2365); 
+			pushFollow(FOLLOW_fixed_64bit_literal_in_insn_format21lh2367);
+			fixed_64bit_literal131=fixed_64bit_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21lh129!=null?INSTRUCTION_FORMAT21lh129.getText():null));
+			      short regA = parseRegister_byte((REGISTER130!=null?REGISTER130.getText():null));
+
+			      long litB = fixed_64bit_literal131;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21lh(opcode, regA, litB));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format21lh"
+
+
+
+	// $ANTLR start "insn_format21s"
+	// smaliTreeWalker.g:891:1: insn_format21s : ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) ;
+	public final void insn_format21s() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT21s132=null;
+		CommonTree REGISTER133=null;
+		short short_integral_literal134 =0;
+
+		try {
+			// smaliTreeWalker.g:892:3: ( ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) )
+			// smaliTreeWalker.g:893:5: ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal )
+			{
+			match(input,I_STATEMENT_FORMAT21s,FOLLOW_I_STATEMENT_FORMAT21s_in_insn_format21s2390); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21s132=(CommonTree)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s2392); 
+			REGISTER133=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s2394); 
+			pushFollow(FOLLOW_short_integral_literal_in_insn_format21s2396);
+			short_integral_literal134=short_integral_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21s132!=null?INSTRUCTION_FORMAT21s132.getText():null));
+			      short regA = parseRegister_byte((REGISTER133!=null?REGISTER133.getText():null));
+
+			      short litB = short_integral_literal134;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21s(opcode, regA, litB));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format21s"
+
+
+
+	// $ANTLR start "insn_format21t"
+	// smaliTreeWalker.g:903:1: insn_format21t : ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) ;
+	public final void insn_format21t() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT21t135=null;
+		CommonTree REGISTER136=null;
+		Label label_ref137 =null;
+
+		try {
+			// smaliTreeWalker.g:904:3: ( ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) )
+			// smaliTreeWalker.g:905:5: ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref )
+			{
+			match(input,I_STATEMENT_FORMAT21t,FOLLOW_I_STATEMENT_FORMAT21t_in_insn_format21t2419); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21t135=(CommonTree)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t2421); 
+			REGISTER136=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t2423); 
+			pushFollow(FOLLOW_label_ref_in_insn_format21t2425);
+			label_ref137=label_ref();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21t135!=null?INSTRUCTION_FORMAT21t135.getText():null));
+			      short regA = parseRegister_byte((REGISTER136!=null?REGISTER136.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21t(opcode, regA, label_ref137));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format21t"
+
+
+
+	// $ANTLR start "insn_format22b"
+	// smaliTreeWalker.g:913:1: insn_format22b : ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) ;
+	public final void insn_format22b() throws RecognitionException {
+		CommonTree registerA=null;
+		CommonTree registerB=null;
+		CommonTree INSTRUCTION_FORMAT22b138=null;
+		short short_integral_literal139 =0;
+
+		try {
+			// smaliTreeWalker.g:914:3: ( ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) )
+			// smaliTreeWalker.g:915:5: ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal )
+			{
+			match(input,I_STATEMENT_FORMAT22b,FOLLOW_I_STATEMENT_FORMAT22b_in_insn_format22b2448); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22b138=(CommonTree)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b2450); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2454); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2458); 
+			pushFollow(FOLLOW_short_integral_literal_in_insn_format22b2460);
+			short_integral_literal139=short_integral_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22b138!=null?INSTRUCTION_FORMAT22b138.getText():null));
+			      short regA = parseRegister_byte((registerA!=null?registerA.getText():null));
+			      short regB = parseRegister_byte((registerB!=null?registerB.getText():null));
+
+			      short litC = short_integral_literal139;
+			      LiteralTools.checkByte(litC);
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22b(opcode, regA, regB, litC));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format22b"
+
+
+
+	// $ANTLR start "insn_format22c_field"
+	// smaliTreeWalker.g:927:1: insn_format22c_field : ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) ;
+	public final void insn_format22c_field() throws RecognitionException {
+		CommonTree inst=null;
+		CommonTree registerA=null;
+		CommonTree registerB=null;
+		ImmutableFieldReference field_reference140 =null;
+
+		try {
+			// smaliTreeWalker.g:928:3: ( ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) )
+			// smaliTreeWalker.g:929:5: ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference )
+			{
+			match(input,I_STATEMENT_FORMAT22c_FIELD,FOLLOW_I_STATEMENT_FORMAT22c_FIELD_in_insn_format22c_field2483); 
+			match(input, Token.DOWN, null); 
+			inst=(CommonTree)input.LT(1);
+			if ( (input.LA(1) >= INSTRUCTION_FORMAT22c_FIELD && input.LA(1) <= INSTRUCTION_FORMAT22c_FIELD_ODEX) ) {
+				input.consume();
+				state.errorRecovery=false;
+			}
+			else {
+				MismatchedSetException mse = new MismatchedSetException(null,input);
+				throw mse;
+			}
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2497); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2501); 
+			pushFollow(FOLLOW_field_reference_in_insn_format22c_field2503);
+			field_reference140=field_reference();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((inst!=null?inst.getText():null));
+			      byte regA = parseRegister_nibble((registerA!=null?registerA.getText():null));
+			      byte regB = parseRegister_nibble((registerB!=null?registerB.getText():null));
+
+			      ImmutableFieldReference fieldReference = field_reference140;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22c(opcode, regA, regB,
+			              dexBuilder.internFieldReference(fieldReference)));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format22c_field"
+
+
+
+	// $ANTLR start "insn_format22c_type"
+	// smaliTreeWalker.g:941:1: insn_format22c_type : ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) ;
+	public final void insn_format22c_type() throws RecognitionException {
+		CommonTree registerA=null;
+		CommonTree registerB=null;
+		CommonTree INSTRUCTION_FORMAT22c_TYPE141=null;
+		TreeRuleReturnScope nonvoid_type_descriptor142 =null;
+
+		try {
+			// smaliTreeWalker.g:942:3: ( ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) )
+			// smaliTreeWalker.g:943:5: ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor )
+			{
+			match(input,I_STATEMENT_FORMAT22c_TYPE,FOLLOW_I_STATEMENT_FORMAT22c_TYPE_in_insn_format22c_type2526); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22c_TYPE141=(CommonTree)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type2528); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2532); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2536); 
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format22c_type2538);
+			nonvoid_type_descriptor142=nonvoid_type_descriptor();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22c_TYPE141!=null?INSTRUCTION_FORMAT22c_TYPE141.getText():null));
+			      byte regA = parseRegister_nibble((registerA!=null?registerA.getText():null));
+			      byte regB = parseRegister_nibble((registerB!=null?registerB.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22c(opcode, regA, regB,
+			              dexBuilder.internTypeReference((nonvoid_type_descriptor142!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor142).type:null))));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format22c_type"
+
+
+
+	// $ANTLR start "insn_format22s"
+	// smaliTreeWalker.g:953:1: insn_format22s : ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) ;
+	public final void insn_format22s() throws RecognitionException {
+		CommonTree registerA=null;
+		CommonTree registerB=null;
+		CommonTree INSTRUCTION_FORMAT22s143=null;
+		short short_integral_literal144 =0;
+
+		try {
+			// smaliTreeWalker.g:954:3: ( ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) )
+			// smaliTreeWalker.g:955:5: ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal )
+			{
+			match(input,I_STATEMENT_FORMAT22s,FOLLOW_I_STATEMENT_FORMAT22s_in_insn_format22s2561); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22s143=(CommonTree)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_insn_format22s2563); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2567); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2571); 
+			pushFollow(FOLLOW_short_integral_literal_in_insn_format22s2573);
+			short_integral_literal144=short_integral_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22s143!=null?INSTRUCTION_FORMAT22s143.getText():null));
+			      byte regA = parseRegister_nibble((registerA!=null?registerA.getText():null));
+			      byte regB = parseRegister_nibble((registerB!=null?registerB.getText():null));
+
+			      short litC = short_integral_literal144;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22s(opcode, regA, regB, litC));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format22s"
+
+
+
+	// $ANTLR start "insn_format22t"
+	// smaliTreeWalker.g:966:1: insn_format22t : ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) ;
+	public final void insn_format22t() throws RecognitionException {
+		CommonTree registerA=null;
+		CommonTree registerB=null;
+		CommonTree INSTRUCTION_FORMAT22t145=null;
+		Label label_ref146 =null;
+
+		try {
+			// smaliTreeWalker.g:967:3: ( ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) )
+			// smaliTreeWalker.g:968:5: ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref )
+			{
+			match(input,I_STATEMENT_FORMAT22t,FOLLOW_I_STATEMENT_FORMAT22t_in_insn_format22t2596); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22t145=(CommonTree)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t2598); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2602); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2606); 
+			pushFollow(FOLLOW_label_ref_in_insn_format22t2608);
+			label_ref146=label_ref();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22t145!=null?INSTRUCTION_FORMAT22t145.getText():null));
+			      byte regA = parseRegister_nibble((registerA!=null?registerA.getText():null));
+			      byte regB = parseRegister_nibble((registerB!=null?registerB.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22t(opcode, regA, regB, label_ref146));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format22t"
+
+
+
+	// $ANTLR start "insn_format22x"
+	// smaliTreeWalker.g:977:1: insn_format22x : ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) ;
+	public final void insn_format22x() throws RecognitionException {
+		CommonTree registerA=null;
+		CommonTree registerB=null;
+		CommonTree INSTRUCTION_FORMAT22x147=null;
+
+		try {
+			// smaliTreeWalker.g:978:3: ( ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) )
+			// smaliTreeWalker.g:979:5: ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER )
+			{
+			match(input,I_STATEMENT_FORMAT22x,FOLLOW_I_STATEMENT_FORMAT22x_in_insn_format22x2631); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22x147=(CommonTree)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x2633); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2637); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2641); 
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22x147!=null?INSTRUCTION_FORMAT22x147.getText():null));
+			      short regA = parseRegister_byte((registerA!=null?registerA.getText():null));
+			      int regB = parseRegister_short((registerB!=null?registerB.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22x(opcode, regA, regB));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format22x"
+
+
+
+	// $ANTLR start "insn_format23x"
+	// smaliTreeWalker.g:988:1: insn_format23x : ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) ;
+	public final void insn_format23x() throws RecognitionException {
+		CommonTree registerA=null;
+		CommonTree registerB=null;
+		CommonTree registerC=null;
+		CommonTree INSTRUCTION_FORMAT23x148=null;
+
+		try {
+			// smaliTreeWalker.g:989:3: ( ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) )
+			// smaliTreeWalker.g:990:5: ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER )
+			{
+			match(input,I_STATEMENT_FORMAT23x,FOLLOW_I_STATEMENT_FORMAT23x_in_insn_format23x2664); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT23x148=(CommonTree)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x2666); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2670); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2674); 
+			registerC=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2678); 
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT23x148!=null?INSTRUCTION_FORMAT23x148.getText():null));
+			      short regA = parseRegister_byte((registerA!=null?registerA.getText():null));
+			      short regB = parseRegister_byte((registerB!=null?registerB.getText():null));
+			      short regC = parseRegister_byte((registerC!=null?registerC.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction23x(opcode, regA, regB, regC));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format23x"
+
+
+
+	// $ANTLR start "insn_format30t"
+	// smaliTreeWalker.g:1000:1: insn_format30t : ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) ;
+	public final void insn_format30t() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT30t149=null;
+		Label label_ref150 =null;
+
+		try {
+			// smaliTreeWalker.g:1001:3: ( ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) )
+			// smaliTreeWalker.g:1002:5: ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref )
+			{
+			match(input,I_STATEMENT_FORMAT30t,FOLLOW_I_STATEMENT_FORMAT30t_in_insn_format30t2701); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT30t149=(CommonTree)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t2703); 
+			pushFollow(FOLLOW_label_ref_in_insn_format30t2705);
+			label_ref150=label_ref();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT30t149!=null?INSTRUCTION_FORMAT30t149.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction30t(opcode, label_ref150));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format30t"
+
+
+
+	// $ANTLR start "insn_format31c"
+	// smaliTreeWalker.g:1009:1: insn_format31c : ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) ;
+	public final void insn_format31c() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT31c151=null;
+		CommonTree REGISTER152=null;
+		String string_literal153 =null;
+
+		try {
+			// smaliTreeWalker.g:1010:3: ( ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) )
+			// smaliTreeWalker.g:1011:5: ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal )
+			{
+			match(input,I_STATEMENT_FORMAT31c,FOLLOW_I_STATEMENT_FORMAT31c_in_insn_format31c2728); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT31c151=(CommonTree)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c2730); 
+			REGISTER152=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c2732); 
+			pushFollow(FOLLOW_string_literal_in_insn_format31c2734);
+			string_literal153=string_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT31c151!=null?INSTRUCTION_FORMAT31c151.getText():null));
+			      short regA = parseRegister_byte((REGISTER152!=null?REGISTER152.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction31c(opcode, regA,
+			              dexBuilder.internStringReference(string_literal153)));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format31c"
+
+
+
+	// $ANTLR start "insn_format31i"
+	// smaliTreeWalker.g:1020:1: insn_format31i : ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) ;
+	public final void insn_format31i() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT31i154=null;
+		CommonTree REGISTER155=null;
+		int fixed_32bit_literal156 =0;
+
+		try {
+			// smaliTreeWalker.g:1021:3: ( ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) )
+			// smaliTreeWalker.g:1022:5: ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal )
+			{
+			match(input,I_STATEMENT_FORMAT31i,FOLLOW_I_STATEMENT_FORMAT31i_in_insn_format31i2757); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT31i154=(CommonTree)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_insn_format31i2759); 
+			REGISTER155=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i2761); 
+			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format31i2763);
+			fixed_32bit_literal156=fixed_32bit_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT31i154!=null?INSTRUCTION_FORMAT31i154.getText():null));
+			      short regA = parseRegister_byte((REGISTER155!=null?REGISTER155.getText():null));
+
+			      int litB = fixed_32bit_literal156;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction31i(opcode, regA, litB));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format31i"
+
+
+
+	// $ANTLR start "insn_format31t"
+	// smaliTreeWalker.g:1032:1: insn_format31t : ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) ;
+	public final void insn_format31t() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT31t157=null;
+		CommonTree REGISTER158=null;
+		Label label_ref159 =null;
+
+		try {
+			// smaliTreeWalker.g:1033:3: ( ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) )
+			// smaliTreeWalker.g:1034:5: ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref )
+			{
+			match(input,I_STATEMENT_FORMAT31t,FOLLOW_I_STATEMENT_FORMAT31t_in_insn_format31t2786); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT31t157=(CommonTree)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t2788); 
+			REGISTER158=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t2790); 
+			pushFollow(FOLLOW_label_ref_in_insn_format31t2792);
+			label_ref159=label_ref();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT31t157!=null?INSTRUCTION_FORMAT31t157.getText():null));
+
+			      short regA = parseRegister_byte((REGISTER158!=null?REGISTER158.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction31t(opcode, regA, label_ref159));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format31t"
+
+
+
+	// $ANTLR start "insn_format32x"
+	// smaliTreeWalker.g:1043:1: insn_format32x : ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) ;
+	public final void insn_format32x() throws RecognitionException {
+		CommonTree registerA=null;
+		CommonTree registerB=null;
+		CommonTree INSTRUCTION_FORMAT32x160=null;
+
+		try {
+			// smaliTreeWalker.g:1044:3: ( ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) )
+			// smaliTreeWalker.g:1045:5: ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER )
+			{
+			match(input,I_STATEMENT_FORMAT32x,FOLLOW_I_STATEMENT_FORMAT32x_in_insn_format32x2815); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT32x160=(CommonTree)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x2817); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2821); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2825); 
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT32x160!=null?INSTRUCTION_FORMAT32x160.getText():null));
+			      int regA = parseRegister_short((registerA!=null?registerA.getText():null));
+			      int regB = parseRegister_short((registerB!=null?registerB.getText():null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction32x(opcode, regA, regB));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format32x"
+
+
+
+	// $ANTLR start "insn_format35c_method"
+	// smaliTreeWalker.g:1054:1: insn_format35c_method : ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ;
+	public final void insn_format35c_method() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT35c_METHOD161=null;
+		TreeRuleReturnScope register_list162 =null;
+		ImmutableMethodReference method_reference163 =null;
+
+		try {
+			// smaliTreeWalker.g:1055:3: ( ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) )
+			// smaliTreeWalker.g:1056:5: ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference )
+			{
+			match(input,I_STATEMENT_FORMAT35c_METHOD,FOLLOW_I_STATEMENT_FORMAT35c_METHOD_in_insn_format35c_method2848); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT35c_METHOD161=(CommonTree)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method2850); 
+			pushFollow(FOLLOW_register_list_in_insn_format35c_method2852);
+			register_list162=register_list();
+			state._fsp--;
+
+			pushFollow(FOLLOW_method_reference_in_insn_format35c_method2854);
+			method_reference163=method_reference();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT35c_METHOD161!=null?INSTRUCTION_FORMAT35c_METHOD161.getText():null));
+
+			      //this depends on the fact that register_list returns a byte[5]
+			      byte[] registers = (register_list162!=null?((smaliTreeWalker.register_list_return)register_list162).registers:null);
+			      byte registerCount = (register_list162!=null?((smaliTreeWalker.register_list_return)register_list162).registerCount:0);
+
+			      ImmutableMethodReference methodReference = method_reference163;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction35c(opcode, registerCount, registers[0], registers[1],
+			              registers[2], registers[3], registers[4], dexBuilder.internMethodReference(methodReference)));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format35c_method"
+
+
+
+	// $ANTLR start "insn_format35c_type"
+	// smaliTreeWalker.g:1070:1: insn_format35c_type : ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ;
+	public final void insn_format35c_type() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT35c_TYPE164=null;
+		TreeRuleReturnScope register_list165 =null;
+		TreeRuleReturnScope nonvoid_type_descriptor166 =null;
+
+		try {
+			// smaliTreeWalker.g:1071:3: ( ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) )
+			// smaliTreeWalker.g:1072:5: ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor )
+			{
+			match(input,I_STATEMENT_FORMAT35c_TYPE,FOLLOW_I_STATEMENT_FORMAT35c_TYPE_in_insn_format35c_type2877); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT35c_TYPE164=(CommonTree)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type2879); 
+			pushFollow(FOLLOW_register_list_in_insn_format35c_type2881);
+			register_list165=register_list();
+			state._fsp--;
+
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format35c_type2883);
+			nonvoid_type_descriptor166=nonvoid_type_descriptor();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT35c_TYPE164!=null?INSTRUCTION_FORMAT35c_TYPE164.getText():null));
+
+			      //this depends on the fact that register_list returns a byte[5]
+			      byte[] registers = (register_list165!=null?((smaliTreeWalker.register_list_return)register_list165).registers:null);
+			      byte registerCount = (register_list165!=null?((smaliTreeWalker.register_list_return)register_list165).registerCount:0);
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction35c(opcode, registerCount, registers[0], registers[1],
+			              registers[2], registers[3], registers[4], dexBuilder.internTypeReference((nonvoid_type_descriptor166!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor166).type:null))));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format35c_type"
+
+
+
+	// $ANTLR start "insn_format3rc_method"
+	// smaliTreeWalker.g:1084:1: insn_format3rc_method : ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ;
+	public final void insn_format3rc_method() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT3rc_METHOD167=null;
+		TreeRuleReturnScope register_range168 =null;
+		ImmutableMethodReference method_reference169 =null;
+
+		try {
+			// smaliTreeWalker.g:1085:3: ( ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) )
+			// smaliTreeWalker.g:1086:5: ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference )
+			{
+			match(input,I_STATEMENT_FORMAT3rc_METHOD,FOLLOW_I_STATEMENT_FORMAT3rc_METHOD_in_insn_format3rc_method2906); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT3rc_METHOD167=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method2908); 
+			pushFollow(FOLLOW_register_range_in_insn_format3rc_method2910);
+			register_range168=register_range();
+			state._fsp--;
+
+			pushFollow(FOLLOW_method_reference_in_insn_format3rc_method2912);
+			method_reference169=method_reference();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT3rc_METHOD167!=null?INSTRUCTION_FORMAT3rc_METHOD167.getText():null));
+			      int startRegister = (register_range168!=null?((smaliTreeWalker.register_range_return)register_range168).startRegister:0);
+			      int endRegister = (register_range168!=null?((smaliTreeWalker.register_range_return)register_range168).endRegister:0);
+
+			      int registerCount = endRegister-startRegister+1;
+
+			      ImmutableMethodReference methodReference = method_reference169;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction3rc(opcode, startRegister, registerCount,
+			              dexBuilder.internMethodReference(methodReference)));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format3rc_method"
+
+
+
+	// $ANTLR start "insn_format3rc_type"
+	// smaliTreeWalker.g:1100:1: insn_format3rc_type : ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ;
+	public final void insn_format3rc_type() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT3rc_TYPE170=null;
+		TreeRuleReturnScope register_range171 =null;
+		TreeRuleReturnScope nonvoid_type_descriptor172 =null;
+
+		try {
+			// smaliTreeWalker.g:1101:3: ( ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) )
+			// smaliTreeWalker.g:1102:5: ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor )
+			{
+			match(input,I_STATEMENT_FORMAT3rc_TYPE,FOLLOW_I_STATEMENT_FORMAT3rc_TYPE_in_insn_format3rc_type2935); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT3rc_TYPE170=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type2937); 
+			pushFollow(FOLLOW_register_range_in_insn_format3rc_type2939);
+			register_range171=register_range();
+			state._fsp--;
+
+			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format3rc_type2941);
+			nonvoid_type_descriptor172=nonvoid_type_descriptor();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT3rc_TYPE170!=null?INSTRUCTION_FORMAT3rc_TYPE170.getText():null));
+			      int startRegister = (register_range171!=null?((smaliTreeWalker.register_range_return)register_range171).startRegister:0);
+			      int endRegister = (register_range171!=null?((smaliTreeWalker.register_range_return)register_range171).endRegister:0);
+
+			      int registerCount = endRegister-startRegister+1;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction3rc(opcode, startRegister, registerCount,
+			              dexBuilder.internTypeReference((nonvoid_type_descriptor172!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor172).type:null))));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format3rc_type"
+
+
+
+	// $ANTLR start "insn_format45cc_method"
+	// smaliTreeWalker.g:1114:1: insn_format45cc_method : ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ;
+	public final void insn_format45cc_method() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT45cc_METHOD173=null;
+		TreeRuleReturnScope register_list174 =null;
+		ImmutableMethodReference method_reference175 =null;
+		TreeRuleReturnScope method_prototype176 =null;
+
+		try {
+			// smaliTreeWalker.g:1115:3: ( ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) )
+			// smaliTreeWalker.g:1116:5: ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype )
+			{
+			match(input,I_STATEMENT_FORMAT45cc_METHOD,FOLLOW_I_STATEMENT_FORMAT45cc_METHOD_in_insn_format45cc_method2964); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT45cc_METHOD173=(CommonTree)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method2966); 
+			pushFollow(FOLLOW_register_list_in_insn_format45cc_method2968);
+			register_list174=register_list();
+			state._fsp--;
+
+			pushFollow(FOLLOW_method_reference_in_insn_format45cc_method2970);
+			method_reference175=method_reference();
+			state._fsp--;
+
+			pushFollow(FOLLOW_method_prototype_in_insn_format45cc_method2972);
+			method_prototype176=method_prototype();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT45cc_METHOD173!=null?INSTRUCTION_FORMAT45cc_METHOD173.getText():null));
+
+			      //this depends on the fact that register_list returns a byte[5]
+			      byte[] registers = (register_list174!=null?((smaliTreeWalker.register_list_return)register_list174).registers:null);
+			      byte registerCount = (register_list174!=null?((smaliTreeWalker.register_list_return)register_list174).registerCount:0);
+
+			      ImmutableMethodReference methodReference = method_reference175;
+			      ImmutableMethodProtoReference methodProtoReference = new ImmutableMethodProtoReference(
+			              (method_prototype176!=null?((smaliTreeWalker.method_prototype_return)method_prototype176).parameters:null),
+			              (method_prototype176!=null?((smaliTreeWalker.method_prototype_return)method_prototype176).returnType:null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction45cc(opcode, registerCount, registers[0], registers[1],
+			              registers[2], registers[3], registers[4],
+			              dexBuilder.internMethodReference(methodReference),
+			              dexBuilder.internMethodProtoReference(methodProtoReference)));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format45cc_method"
+
+
+
+	// $ANTLR start "insn_format4rcc_method"
+	// smaliTreeWalker.g:1135:1: insn_format4rcc_method : ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ;
+	public final void insn_format4rcc_method() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT4rcc_METHOD177=null;
+		TreeRuleReturnScope register_range178 =null;
+		ImmutableMethodReference method_reference179 =null;
+		TreeRuleReturnScope method_prototype180 =null;
+
+		try {
+			// smaliTreeWalker.g:1136:3: ( ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) )
+			// smaliTreeWalker.g:1137:5: ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype )
+			{
+			match(input,I_STATEMENT_FORMAT4rcc_METHOD,FOLLOW_I_STATEMENT_FORMAT4rcc_METHOD_in_insn_format4rcc_method2995); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT4rcc_METHOD177=(CommonTree)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method2997); 
+			pushFollow(FOLLOW_register_range_in_insn_format4rcc_method2999);
+			register_range178=register_range();
+			state._fsp--;
+
+			pushFollow(FOLLOW_method_reference_in_insn_format4rcc_method3001);
+			method_reference179=method_reference();
+			state._fsp--;
+
+			pushFollow(FOLLOW_method_prototype_in_insn_format4rcc_method3003);
+			method_prototype180=method_prototype();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT4rcc_METHOD177!=null?INSTRUCTION_FORMAT4rcc_METHOD177.getText():null));
+			      int startRegister = (register_range178!=null?((smaliTreeWalker.register_range_return)register_range178).startRegister:0);
+			      int endRegister = (register_range178!=null?((smaliTreeWalker.register_range_return)register_range178).endRegister:0);
+
+			      int registerCount = endRegister-startRegister+1;
+
+			      ImmutableMethodReference methodReference = method_reference179;
+			      ImmutableMethodProtoReference methodProtoReference = new ImmutableMethodProtoReference(
+			              (method_prototype180!=null?((smaliTreeWalker.method_prototype_return)method_prototype180).parameters:null),
+			              (method_prototype180!=null?((smaliTreeWalker.method_prototype_return)method_prototype180).returnType:null));
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction4rcc(opcode, startRegister, registerCount,
+			              dexBuilder.internMethodReference(methodReference),
+			              dexBuilder.internMethodProtoReference(methodProtoReference)));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format4rcc_method"
+
+
+
+	// $ANTLR start "insn_format51l_type"
+	// smaliTreeWalker.g:1155:1: insn_format51l_type : ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) ;
+	public final void insn_format51l_type() throws RecognitionException {
+		CommonTree INSTRUCTION_FORMAT51l181=null;
+		CommonTree REGISTER182=null;
+		long fixed_64bit_literal183 =0;
+
+		try {
+			// smaliTreeWalker.g:1156:3: ( ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) )
+			// smaliTreeWalker.g:1157:5: ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal )
+			{
+			match(input,I_STATEMENT_FORMAT51l,FOLLOW_I_STATEMENT_FORMAT51l_in_insn_format51l_type3026); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT51l181=(CommonTree)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l_type3028); 
+			REGISTER182=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l_type3030); 
+			pushFollow(FOLLOW_fixed_64bit_literal_in_insn_format51l_type3032);
+			fixed_64bit_literal183=fixed_64bit_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT51l181!=null?INSTRUCTION_FORMAT51l181.getText():null));
+			      short regA = parseRegister_byte((REGISTER182!=null?REGISTER182.getText():null));
+
+			      long litB = fixed_64bit_literal183;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction51l(opcode, regA, litB));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_format51l_type"
+
+
+
+	// $ANTLR start "insn_array_data_directive"
+	// smaliTreeWalker.g:1167:1: insn_array_data_directive : ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) ;
+	public final void insn_array_data_directive() throws RecognitionException {
+		short short_integral_literal184 =0;
+		List<Number> array_elements185 =null;
+
+		try {
+			// smaliTreeWalker.g:1168:3: ( ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) )
+			// smaliTreeWalker.g:1169:5: ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements )
+			{
+			match(input,I_STATEMENT_ARRAY_DATA,FOLLOW_I_STATEMENT_ARRAY_DATA_in_insn_array_data_directive3055); 
+			match(input, Token.DOWN, null); 
+			match(input,I_ARRAY_ELEMENT_SIZE,FOLLOW_I_ARRAY_ELEMENT_SIZE_in_insn_array_data_directive3058); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_short_integral_literal_in_insn_array_data_directive3060);
+			short_integral_literal184=short_integral_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+			pushFollow(FOLLOW_array_elements_in_insn_array_data_directive3063);
+			array_elements185=array_elements();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      int elementWidth = short_integral_literal184;
+			      List<Number> elements = array_elements185;
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderArrayPayload(elementWidth, array_elements185));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_array_data_directive"
+
+
+
+	// $ANTLR start "insn_packed_switch_directive"
+	// smaliTreeWalker.g:1177:1: insn_packed_switch_directive : ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) ;
+	public final void insn_packed_switch_directive() throws RecognitionException {
+		int fixed_32bit_literal186 =0;
+		List<Label> packed_switch_elements187 =null;
+
+		try {
+			// smaliTreeWalker.g:1178:3: ( ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) )
+			// smaliTreeWalker.g:1179:5: ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements )
+			{
+			match(input,I_STATEMENT_PACKED_SWITCH,FOLLOW_I_STATEMENT_PACKED_SWITCH_in_insn_packed_switch_directive3085); 
+			match(input, Token.DOWN, null); 
+			match(input,I_PACKED_SWITCH_START_KEY,FOLLOW_I_PACKED_SWITCH_START_KEY_in_insn_packed_switch_directive3088); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_packed_switch_directive3090);
+			fixed_32bit_literal186=fixed_32bit_literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+			pushFollow(FOLLOW_packed_switch_elements_in_insn_packed_switch_directive3093);
+			packed_switch_elements187=packed_switch_elements();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			        int startKey = fixed_32bit_literal186;
+			        method_stack.peek().methodBuilder.addInstruction(new BuilderPackedSwitchPayload(startKey,
+			            packed_switch_elements187));
+			      
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_packed_switch_directive"
+
+
+
+	// $ANTLR start "insn_sparse_switch_directive"
+	// smaliTreeWalker.g:1186:1: insn_sparse_switch_directive : ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) ;
+	public final void insn_sparse_switch_directive() throws RecognitionException {
+		List<SwitchLabelElement> sparse_switch_elements188 =null;
+
+		try {
+			// smaliTreeWalker.g:1187:3: ( ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) )
+			// smaliTreeWalker.g:1188:5: ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements )
+			{
+			match(input,I_STATEMENT_SPARSE_SWITCH,FOLLOW_I_STATEMENT_SPARSE_SWITCH_in_insn_sparse_switch_directive3117); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_sparse_switch_elements_in_insn_sparse_switch_directive3119);
+			sparse_switch_elements188=sparse_switch_elements();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      method_stack.peek().methodBuilder.addInstruction(new BuilderSparseSwitchPayload(sparse_switch_elements188));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+	}
+	// $ANTLR end "insn_sparse_switch_directive"
+
+
+
+	// $ANTLR start "array_descriptor"
+	// smaliTreeWalker.g:1193:1: array_descriptor returns [String type] : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ;
+	public final String array_descriptor() throws RecognitionException {
+		String type = null;
+
+
+		CommonTree ARRAY_TYPE_PREFIX189=null;
+		CommonTree PRIMITIVE_TYPE190=null;
+		CommonTree CLASS_DESCRIPTOR191=null;
+
+		try {
+			// smaliTreeWalker.g:1194:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) )
+			// smaliTreeWalker.g:1194:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR )
+			{
+			ARRAY_TYPE_PREFIX189=(CommonTree)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor3140); 
+			// smaliTreeWalker.g:1194:23: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR )
+			int alt37=2;
+			int LA37_0 = input.LA(1);
+			if ( (LA37_0==PRIMITIVE_TYPE) ) {
+				alt37=1;
+			}
+			else if ( (LA37_0==CLASS_DESCRIPTOR) ) {
+				alt37=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 37, 0, input);
+				throw nvae;
+			}
+
+			switch (alt37) {
+				case 1 :
+					// smaliTreeWalker.g:1194:25: PRIMITIVE_TYPE
+					{
+					PRIMITIVE_TYPE190=(CommonTree)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_array_descriptor3144); 
+					 type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (PRIMITIVE_TYPE190!=null?PRIMITIVE_TYPE190.getText():null); 
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:1195:25: CLASS_DESCRIPTOR
+					{
+					CLASS_DESCRIPTOR191=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_array_descriptor3172); 
+					 type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (CLASS_DESCRIPTOR191!=null?CLASS_DESCRIPTOR191.getText():null); 
+					}
+					break;
+
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return type;
+	}
+	// $ANTLR end "array_descriptor"
+
+
+	public static class nonvoid_type_descriptor_return extends TreeRuleReturnScope {
+		public String type;
+	};
+
+
+	// $ANTLR start "nonvoid_type_descriptor"
+	// smaliTreeWalker.g:1197:1: nonvoid_type_descriptor returns [String type] : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) ;
+	public final smaliTreeWalker.nonvoid_type_descriptor_return nonvoid_type_descriptor() throws RecognitionException {
+		smaliTreeWalker.nonvoid_type_descriptor_return retval = new smaliTreeWalker.nonvoid_type_descriptor_return();
+		retval.start = input.LT(1);
+
+		String array_descriptor192 =null;
+
+		try {
+			// smaliTreeWalker.g:1198:3: ( ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) )
+			// smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
+			{
+			// smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
+			int alt38=3;
+			switch ( input.LA(1) ) {
+			case PRIMITIVE_TYPE:
+				{
+				alt38=1;
+				}
+				break;
+			case CLASS_DESCRIPTOR:
+				{
+				alt38=2;
+				}
+				break;
+			case ARRAY_TYPE_PREFIX:
+				{
+				alt38=3;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 38, 0, input);
+				throw nvae;
+			}
+			switch (alt38) {
+				case 1 :
+					// smaliTreeWalker.g:1198:6: PRIMITIVE_TYPE
+					{
+					match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor3190); 
+					 retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); 
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:1199:5: CLASS_DESCRIPTOR
+					{
+					match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor3198); 
+					 retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); 
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:1200:5: array_descriptor
+					{
+					pushFollow(FOLLOW_array_descriptor_in_nonvoid_type_descriptor3206);
+					array_descriptor192=array_descriptor();
+					state._fsp--;
+
+					 retval.type = array_descriptor192; 
+					}
+					break;
+
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "nonvoid_type_descriptor"
+
+
+	public static class reference_type_descriptor_return extends TreeRuleReturnScope {
+		public String type;
+	};
+
+
+	// $ANTLR start "reference_type_descriptor"
+	// smaliTreeWalker.g:1203:1: reference_type_descriptor returns [String type] : ( CLASS_DESCRIPTOR | array_descriptor ) ;
+	public final smaliTreeWalker.reference_type_descriptor_return reference_type_descriptor() throws RecognitionException {
+		smaliTreeWalker.reference_type_descriptor_return retval = new smaliTreeWalker.reference_type_descriptor_return();
+		retval.start = input.LT(1);
+
+		String array_descriptor193 =null;
+
+		try {
+			// smaliTreeWalker.g:1204:3: ( ( CLASS_DESCRIPTOR | array_descriptor ) )
+			// smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor )
+			{
+			// smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor )
+			int alt39=2;
+			int LA39_0 = input.LA(1);
+			if ( (LA39_0==CLASS_DESCRIPTOR) ) {
+				alt39=1;
+			}
+			else if ( (LA39_0==ARRAY_TYPE_PREFIX) ) {
+				alt39=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 39, 0, input);
+				throw nvae;
+			}
+
+			switch (alt39) {
+				case 1 :
+					// smaliTreeWalker.g:1204:6: CLASS_DESCRIPTOR
+					{
+					match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor3227); 
+					 retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); 
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:1205:5: array_descriptor
+					{
+					pushFollow(FOLLOW_array_descriptor_in_reference_type_descriptor3235);
+					array_descriptor193=array_descriptor();
+					state._fsp--;
+
+					 retval.type = array_descriptor193; 
+					}
+					break;
+
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "reference_type_descriptor"
+
+
+
+	// $ANTLR start "type_descriptor"
+	// smaliTreeWalker.g:1208:1: type_descriptor returns [String type] : ( VOID_TYPE | nonvoid_type_descriptor );
+	public final String type_descriptor() throws RecognitionException {
+		String type = null;
+
+
+		TreeRuleReturnScope nonvoid_type_descriptor194 =null;
+
+		try {
+			// smaliTreeWalker.g:1209:3: ( VOID_TYPE | nonvoid_type_descriptor )
+			int alt40=2;
+			int LA40_0 = input.LA(1);
+			if ( (LA40_0==VOID_TYPE) ) {
+				alt40=1;
+			}
+			else if ( (LA40_0==ARRAY_TYPE_PREFIX||LA40_0==CLASS_DESCRIPTOR||LA40_0==PRIMITIVE_TYPE) ) {
+				alt40=2;
+			}
+
+			else {
+				NoViableAltException nvae =
+					new NoViableAltException("", 40, 0, input);
+				throw nvae;
+			}
+
+			switch (alt40) {
+				case 1 :
+					// smaliTreeWalker.g:1209:5: VOID_TYPE
+					{
+					match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor3255); 
+					type = "V";
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:1210:5: nonvoid_type_descriptor
+					{
+					pushFollow(FOLLOW_nonvoid_type_descriptor_in_type_descriptor3263);
+					nonvoid_type_descriptor194=nonvoid_type_descriptor();
+					state._fsp--;
+
+					type = (nonvoid_type_descriptor194!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor194).type:null);
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return type;
+	}
+	// $ANTLR end "type_descriptor"
+
+
+
+	// $ANTLR start "short_integral_literal"
+	// smaliTreeWalker.g:1213:1: short_integral_literal returns [short value] : ( long_literal | integer_literal | short_literal | char_literal | byte_literal );
+	public final short short_integral_literal() throws RecognitionException {
+		short value = 0;
+
+
+		long long_literal195 =0;
+		int integer_literal196 =0;
+		short short_literal197 =0;
+		char char_literal198 =0;
+		byte byte_literal199 =0;
+
+		try {
+			// smaliTreeWalker.g:1214:3: ( long_literal | integer_literal | short_literal | char_literal | byte_literal )
+			int alt41=5;
+			switch ( input.LA(1) ) {
+			case LONG_LITERAL:
+				{
+				alt41=1;
+				}
+				break;
+			case INTEGER_LITERAL:
+				{
+				alt41=2;
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt41=3;
+				}
+				break;
+			case CHAR_LITERAL:
+				{
+				alt41=4;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt41=5;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 41, 0, input);
+				throw nvae;
+			}
+			switch (alt41) {
+				case 1 :
+					// smaliTreeWalker.g:1214:5: long_literal
+					{
+					pushFollow(FOLLOW_long_literal_in_short_integral_literal3281);
+					long_literal195=long_literal();
+					state._fsp--;
+
+
+					      LiteralTools.checkShort(long_literal195);
+					      value = (short)long_literal195;
+					    
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:1219:5: integer_literal
+					{
+					pushFollow(FOLLOW_integer_literal_in_short_integral_literal3293);
+					integer_literal196=integer_literal();
+					state._fsp--;
+
+
+					      LiteralTools.checkShort(integer_literal196);
+					      value = (short)integer_literal196;
+					    
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:1224:5: short_literal
+					{
+					pushFollow(FOLLOW_short_literal_in_short_integral_literal3305);
+					short_literal197=short_literal();
+					state._fsp--;
+
+					value = short_literal197;
+					}
+					break;
+				case 4 :
+					// smaliTreeWalker.g:1225:5: char_literal
+					{
+					pushFollow(FOLLOW_char_literal_in_short_integral_literal3313);
+					char_literal198=char_literal();
+					state._fsp--;
+
+					value = (short)char_literal198;
+					}
+					break;
+				case 5 :
+					// smaliTreeWalker.g:1226:5: byte_literal
+					{
+					pushFollow(FOLLOW_byte_literal_in_short_integral_literal3321);
+					byte_literal199=byte_literal();
+					state._fsp--;
+
+					value = byte_literal199;
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "short_integral_literal"
+
+
+
+	// $ANTLR start "integral_literal"
+	// smaliTreeWalker.g:1228:1: integral_literal returns [int value] : ( long_literal | integer_literal | short_literal | byte_literal );
+	public final int integral_literal() throws RecognitionException {
+		int value = 0;
+
+
+		long long_literal200 =0;
+		int integer_literal201 =0;
+		short short_literal202 =0;
+		byte byte_literal203 =0;
+
+		try {
+			// smaliTreeWalker.g:1229:3: ( long_literal | integer_literal | short_literal | byte_literal )
+			int alt42=4;
+			switch ( input.LA(1) ) {
+			case LONG_LITERAL:
+				{
+				alt42=1;
+				}
+				break;
+			case INTEGER_LITERAL:
+				{
+				alt42=2;
+				}
+				break;
+			case SHORT_LITERAL:
+				{
+				alt42=3;
+				}
+				break;
+			case BYTE_LITERAL:
+				{
+				alt42=4;
+				}
+				break;
+			default:
+				NoViableAltException nvae =
+					new NoViableAltException("", 42, 0, input);
+				throw nvae;
+			}
+			switch (alt42) {
+				case 1 :
+					// smaliTreeWalker.g:1229:5: long_literal
+					{
+					pushFollow(FOLLOW_long_literal_in_integral_literal3336);
+					long_literal200=long_literal();
+					state._fsp--;
+
+
+					      LiteralTools.checkInt(long_literal200);
+					      value = (int)long_literal200;
+					    
+					}
+					break;
+				case 2 :
+					// smaliTreeWalker.g:1234:5: integer_literal
+					{
+					pushFollow(FOLLOW_integer_literal_in_integral_literal3348);
+					integer_literal201=integer_literal();
+					state._fsp--;
+
+					value = integer_literal201;
+					}
+					break;
+				case 3 :
+					// smaliTreeWalker.g:1235:5: short_literal
+					{
+					pushFollow(FOLLOW_short_literal_in_integral_literal3356);
+					short_literal202=short_literal();
+					state._fsp--;
+
+					value = short_literal202;
+					}
+					break;
+				case 4 :
+					// smaliTreeWalker.g:1236:5: byte_literal
+					{
+					pushFollow(FOLLOW_byte_literal_in_integral_literal3364);
+					byte_literal203=byte_literal();
+					state._fsp--;
+
+					value = byte_literal203;
+					}
+					break;
+
+			}
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "integral_literal"
+
+
+
+	// $ANTLR start "integer_literal"
+	// smaliTreeWalker.g:1239:1: integer_literal returns [int value] : INTEGER_LITERAL ;
+	public final int integer_literal() throws RecognitionException {
+		int value = 0;
+
+
+		CommonTree INTEGER_LITERAL204=null;
+
+		try {
+			// smaliTreeWalker.g:1240:3: ( INTEGER_LITERAL )
+			// smaliTreeWalker.g:1240:5: INTEGER_LITERAL
+			{
+			INTEGER_LITERAL204=(CommonTree)match(input,INTEGER_LITERAL,FOLLOW_INTEGER_LITERAL_in_integer_literal3380); 
+			 value = LiteralTools.parseInt((INTEGER_LITERAL204!=null?INTEGER_LITERAL204.getText():null)); 
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "integer_literal"
+
+
+
+	// $ANTLR start "long_literal"
+	// smaliTreeWalker.g:1242:1: long_literal returns [long value] : LONG_LITERAL ;
+	public final long long_literal() throws RecognitionException {
+		long value = 0;
+
+
+		CommonTree LONG_LITERAL205=null;
+
+		try {
+			// smaliTreeWalker.g:1243:3: ( LONG_LITERAL )
+			// smaliTreeWalker.g:1243:5: LONG_LITERAL
+			{
+			LONG_LITERAL205=(CommonTree)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_long_literal3395); 
+			 value = LiteralTools.parseLong((LONG_LITERAL205!=null?LONG_LITERAL205.getText():null)); 
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "long_literal"
+
+
+
+	// $ANTLR start "short_literal"
+	// smaliTreeWalker.g:1245:1: short_literal returns [short value] : SHORT_LITERAL ;
+	public final short short_literal() throws RecognitionException {
+		short value = 0;
+
+
+		CommonTree SHORT_LITERAL206=null;
+
+		try {
+			// smaliTreeWalker.g:1246:3: ( SHORT_LITERAL )
+			// smaliTreeWalker.g:1246:5: SHORT_LITERAL
+			{
+			SHORT_LITERAL206=(CommonTree)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_short_literal3410); 
+			 value = LiteralTools.parseShort((SHORT_LITERAL206!=null?SHORT_LITERAL206.getText():null)); 
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "short_literal"
+
+
+
+	// $ANTLR start "byte_literal"
+	// smaliTreeWalker.g:1248:1: byte_literal returns [byte value] : BYTE_LITERAL ;
+	public final byte byte_literal() throws RecognitionException {
+		byte value = 0;
+
+
+		CommonTree BYTE_LITERAL207=null;
+
+		try {
+			// smaliTreeWalker.g:1249:3: ( BYTE_LITERAL )
+			// smaliTreeWalker.g:1249:5: BYTE_LITERAL
+			{
+			BYTE_LITERAL207=(CommonTree)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_byte_literal3425); 
+			 value = LiteralTools.parseByte((BYTE_LITERAL207!=null?BYTE_LITERAL207.getText():null)); 
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "byte_literal"
+
+
+
+	// $ANTLR start "float_literal"
+	// smaliTreeWalker.g:1251:1: float_literal returns [float value] : FLOAT_LITERAL ;
+	public final float float_literal() throws RecognitionException {
+		float value = 0.0f;
+
+
+		CommonTree FLOAT_LITERAL208=null;
+
+		try {
+			// smaliTreeWalker.g:1252:3: ( FLOAT_LITERAL )
+			// smaliTreeWalker.g:1252:5: FLOAT_LITERAL
+			{
+			FLOAT_LITERAL208=(CommonTree)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal3440); 
+			 value = LiteralTools.parseFloat((FLOAT_LITERAL208!=null?FLOAT_LITERAL208.getText():null)); 
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "float_literal"
+
+
+
+	// $ANTLR start "double_literal"
+	// smaliTreeWalker.g:1254:1: double_literal returns [double value] : DOUBLE_LITERAL ;
+	public final double double_literal() throws RecognitionException {
+		double value = 0.0;
+
+
+		CommonTree DOUBLE_LITERAL209=null;
+
+		try {
+			// smaliTreeWalker.g:1255:3: ( DOUBLE_LITERAL )
+			// smaliTreeWalker.g:1255:5: DOUBLE_LITERAL
+			{
+			DOUBLE_LITERAL209=(CommonTree)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal3455); 
+			 value = LiteralTools.parseDouble((DOUBLE_LITERAL209!=null?DOUBLE_LITERAL209.getText():null)); 
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "double_literal"
+
+
+
+	// $ANTLR start "char_literal"
+	// smaliTreeWalker.g:1257:1: char_literal returns [char value] : CHAR_LITERAL ;
+	public final char char_literal() throws RecognitionException {
+		char value = 0;
+
+
+		CommonTree CHAR_LITERAL210=null;
+
+		try {
+			// smaliTreeWalker.g:1258:3: ( CHAR_LITERAL )
+			// smaliTreeWalker.g:1258:5: CHAR_LITERAL
+			{
+			CHAR_LITERAL210=(CommonTree)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_char_literal3470); 
+			 value = (CHAR_LITERAL210!=null?CHAR_LITERAL210.getText():null).charAt(1); 
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "char_literal"
+
+
+
+	// $ANTLR start "string_literal"
+	// smaliTreeWalker.g:1260:1: string_literal returns [String value] : STRING_LITERAL ;
+	public final String string_literal() throws RecognitionException {
+		String value = null;
+
+
+		CommonTree STRING_LITERAL211=null;
+
+		try {
+			// smaliTreeWalker.g:1261:3: ( STRING_LITERAL )
+			// smaliTreeWalker.g:1261:5: STRING_LITERAL
+			{
+			STRING_LITERAL211=(CommonTree)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_string_literal3485); 
+
+			      value = (STRING_LITERAL211!=null?STRING_LITERAL211.getText():null);
+			      value = value.substring(1,value.length()-1);
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "string_literal"
+
+
+
+	// $ANTLR start "bool_literal"
+	// smaliTreeWalker.g:1267:1: bool_literal returns [boolean value] : BOOL_LITERAL ;
+	public final boolean bool_literal() throws RecognitionException {
+		boolean value = false;
+
+
+		CommonTree BOOL_LITERAL212=null;
+
+		try {
+			// smaliTreeWalker.g:1268:3: ( BOOL_LITERAL )
+			// smaliTreeWalker.g:1268:5: BOOL_LITERAL
+			{
+			BOOL_LITERAL212=(CommonTree)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_bool_literal3504); 
+			 value = Boolean.parseBoolean((BOOL_LITERAL212!=null?BOOL_LITERAL212.getText():null)); 
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "bool_literal"
+
+
+
+	// $ANTLR start "array_literal"
+	// smaliTreeWalker.g:1270:1: array_literal returns [List<EncodedValue> elements] : ^( I_ENCODED_ARRAY ( literal )* ) ;
+	public final List<EncodedValue> array_literal() throws RecognitionException {
+		List<EncodedValue> elements = null;
+
+
+		EncodedValue literal213 =null;
+
+		try {
+			// smaliTreeWalker.g:1271:3: ( ^( I_ENCODED_ARRAY ( literal )* ) )
+			// smaliTreeWalker.g:1271:5: ^( I_ENCODED_ARRAY ( literal )* )
+			{
+			elements = Lists.newArrayList();
+			match(input,I_ENCODED_ARRAY,FOLLOW_I_ENCODED_ARRAY_in_array_literal3526); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:1272:23: ( literal )*
+				loop43:
+				while (true) {
+					int alt43=2;
+					int LA43_0 = input.LA(1);
+					if ( (LA43_0==ARRAY_TYPE_PREFIX||(LA43_0 >= BOOL_LITERAL && LA43_0 <= BYTE_LITERAL)||(LA43_0 >= CHAR_LITERAL && LA43_0 <= CLASS_DESCRIPTOR)||LA43_0==DOUBLE_LITERAL||LA43_0==FLOAT_LITERAL||LA43_0==INTEGER_LITERAL||(LA43_0 >= I_ENCODED_ARRAY && LA43_0 <= I_ENCODED_METHOD)||LA43_0==I_SUBANNOTATION||LA43_0==LONG_LITERAL||LA43_0==NULL_LITERAL||LA43_0==PRIMITIVE_TYPE||LA43_0==SHORT_LITERAL||LA43_0==STRING_LITERAL||LA43_0==VOID_TYPE) ) {
+						alt43=1;
+					}
+
+					switch (alt43) {
+					case 1 :
+						// smaliTreeWalker.g:1272:24: literal
+						{
+						pushFollow(FOLLOW_literal_in_array_literal3529);
+						literal213=literal();
+						state._fsp--;
+
+						elements.add(literal213);
+						}
+						break;
+
+					default :
+						break loop43;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return elements;
+	}
+	// $ANTLR end "array_literal"
+
+
+
+	// $ANTLR start "annotations"
+	// smaliTreeWalker.g:1274:1: annotations returns [Set<Annotation> annotations] : ^( I_ANNOTATIONS ( annotation )* ) ;
+	public final Set<Annotation> annotations() throws RecognitionException {
+		Set<Annotation> annotations = null;
+
+
+		Annotation annotation214 =null;
+
+		try {
+			// smaliTreeWalker.g:1275:3: ( ^( I_ANNOTATIONS ( annotation )* ) )
+			// smaliTreeWalker.g:1275:5: ^( I_ANNOTATIONS ( annotation )* )
+			{
+			HashMap<String, Annotation> annotationMap = Maps.newHashMap();
+			match(input,I_ANNOTATIONS,FOLLOW_I_ANNOTATIONS_in_annotations3554); 
+			if ( input.LA(1)==Token.DOWN ) {
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:1276:21: ( annotation )*
+				loop44:
+				while (true) {
+					int alt44=2;
+					int LA44_0 = input.LA(1);
+					if ( (LA44_0==I_ANNOTATION) ) {
+						alt44=1;
+					}
+
+					switch (alt44) {
+					case 1 :
+						// smaliTreeWalker.g:1276:22: annotation
+						{
+						pushFollow(FOLLOW_annotation_in_annotations3557);
+						annotation214=annotation();
+						state._fsp--;
+
+
+						        Annotation anno = annotation214;
+						        Annotation old = annotationMap.put(anno.getType(), anno);
+						        if (old != null) {
+						            throw new SemanticException(input, "Multiple annotations of type %s", anno.getType());
+						        }
+						    
+						}
+						break;
+
+					default :
+						break loop44;
+					}
+				}
+
+				match(input, Token.UP, null); 
+			}
+
+
+			      if (annotationMap.size() > 0) {
+			        annotations = ImmutableSet.copyOf(annotationMap.values());
+			      }
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return annotations;
+	}
+	// $ANTLR end "annotations"
+
+
+
+	// $ANTLR start "annotation"
+	// smaliTreeWalker.g:1290:1: annotation returns [Annotation annotation] : ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) ;
+	public final Annotation annotation() throws RecognitionException {
+		Annotation annotation = null;
+
+
+		CommonTree ANNOTATION_VISIBILITY215=null;
+		TreeRuleReturnScope subannotation216 =null;
+
+		try {
+			// smaliTreeWalker.g:1291:3: ( ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) )
+			// smaliTreeWalker.g:1291:5: ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation )
+			{
+			match(input,I_ANNOTATION,FOLLOW_I_ANNOTATION_in_annotation3586); 
+			match(input, Token.DOWN, null); 
+			ANNOTATION_VISIBILITY215=(CommonTree)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation3588); 
+			pushFollow(FOLLOW_subannotation_in_annotation3590);
+			subannotation216=subannotation();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      int visibility = AnnotationVisibility.getVisibility((ANNOTATION_VISIBILITY215!=null?ANNOTATION_VISIBILITY215.getText():null));
+			      annotation = new ImmutableAnnotation(visibility, (subannotation216!=null?((smaliTreeWalker.subannotation_return)subannotation216).annotationType:null), (subannotation216!=null?((smaliTreeWalker.subannotation_return)subannotation216).elements:null));
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return annotation;
+	}
+	// $ANTLR end "annotation"
+
+
+
+	// $ANTLR start "annotation_element"
+	// smaliTreeWalker.g:1297:1: annotation_element returns [AnnotationElement element] : ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) ;
+	public final AnnotationElement annotation_element() throws RecognitionException {
+		AnnotationElement element = null;
+
+
+		CommonTree SIMPLE_NAME217=null;
+		EncodedValue literal218 =null;
+
+		try {
+			// smaliTreeWalker.g:1298:3: ( ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) )
+			// smaliTreeWalker.g:1298:5: ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal )
+			{
+			match(input,I_ANNOTATION_ELEMENT,FOLLOW_I_ANNOTATION_ELEMENT_in_annotation_element3611); 
+			match(input, Token.DOWN, null); 
+			SIMPLE_NAME217=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_annotation_element3613); 
+			pushFollow(FOLLOW_literal_in_annotation_element3615);
+			literal218=literal();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      element = new ImmutableAnnotationElement((SIMPLE_NAME217!=null?SIMPLE_NAME217.getText():null), literal218);
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return element;
+	}
+	// $ANTLR end "annotation_element"
+
+
+	public static class subannotation_return extends TreeRuleReturnScope {
+		public String annotationType;
+		public List<AnnotationElement> elements;
+	};
+
+
+	// $ANTLR start "subannotation"
+	// smaliTreeWalker.g:1303:1: subannotation returns [String annotationType, List<AnnotationElement> elements] : ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) ;
+	public final smaliTreeWalker.subannotation_return subannotation() throws RecognitionException {
+		smaliTreeWalker.subannotation_return retval = new smaliTreeWalker.subannotation_return();
+		retval.start = input.LT(1);
+
+		CommonTree CLASS_DESCRIPTOR220=null;
+		AnnotationElement annotation_element219 =null;
+
+		try {
+			// smaliTreeWalker.g:1304:3: ( ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) )
+			// smaliTreeWalker.g:1304:5: ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* )
+			{
+			ArrayList<AnnotationElement> elements = Lists.newArrayList();
+			match(input,I_SUBANNOTATION,FOLLOW_I_SUBANNOTATION_in_subannotation3642); 
+			match(input, Token.DOWN, null); 
+			CLASS_DESCRIPTOR220=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation3652); 
+			// smaliTreeWalker.g:1307:9: ( annotation_element )*
+			loop45:
+			while (true) {
+				int alt45=2;
+				int LA45_0 = input.LA(1);
+				if ( (LA45_0==I_ANNOTATION_ELEMENT) ) {
+					alt45=1;
+				}
+
+				switch (alt45) {
+				case 1 :
+					// smaliTreeWalker.g:1307:10: annotation_element
+					{
+					pushFollow(FOLLOW_annotation_element_in_subannotation3663);
+					annotation_element219=annotation_element();
+					state._fsp--;
+
+
+					           elements.add(annotation_element219);
+					        
+					}
+					break;
+
+				default :
+					break loop45;
+				}
+			}
+
+			match(input, Token.UP, null); 
+
+
+			      retval.annotationType = (CLASS_DESCRIPTOR220!=null?CLASS_DESCRIPTOR220.getText():null);
+			      retval.elements = elements;
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return retval;
+	}
+	// $ANTLR end "subannotation"
+
+
+
+	// $ANTLR start "field_literal"
+	// smaliTreeWalker.g:1317:1: field_literal returns [FieldReference value] : ^( I_ENCODED_FIELD field_reference ) ;
+	public final FieldReference field_literal() throws RecognitionException {
+		FieldReference value = null;
+
+
+		ImmutableFieldReference field_reference221 =null;
+
+		try {
+			// smaliTreeWalker.g:1318:3: ( ^( I_ENCODED_FIELD field_reference ) )
+			// smaliTreeWalker.g:1318:5: ^( I_ENCODED_FIELD field_reference )
+			{
+			match(input,I_ENCODED_FIELD,FOLLOW_I_ENCODED_FIELD_in_field_literal3702); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_field_reference_in_field_literal3704);
+			field_reference221=field_reference();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      value = field_reference221;
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "field_literal"
+
+
+
+	// $ANTLR start "method_literal"
+	// smaliTreeWalker.g:1323:1: method_literal returns [MethodReference value] : ^( I_ENCODED_METHOD method_reference ) ;
+	public final MethodReference method_literal() throws RecognitionException {
+		MethodReference value = null;
+
+
+		ImmutableMethodReference method_reference222 =null;
+
+		try {
+			// smaliTreeWalker.g:1324:3: ( ^( I_ENCODED_METHOD method_reference ) )
+			// smaliTreeWalker.g:1324:5: ^( I_ENCODED_METHOD method_reference )
+			{
+			match(input,I_ENCODED_METHOD,FOLLOW_I_ENCODED_METHOD_in_method_literal3725); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_method_reference_in_method_literal3727);
+			method_reference222=method_reference();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      value = method_reference222;
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "method_literal"
+
+
+
+	// $ANTLR start "enum_literal"
+	// smaliTreeWalker.g:1329:1: enum_literal returns [FieldReference value] : ^( I_ENCODED_ENUM field_reference ) ;
+	public final FieldReference enum_literal() throws RecognitionException {
+		FieldReference value = null;
+
+
+		ImmutableFieldReference field_reference223 =null;
+
+		try {
+			// smaliTreeWalker.g:1330:3: ( ^( I_ENCODED_ENUM field_reference ) )
+			// smaliTreeWalker.g:1330:5: ^( I_ENCODED_ENUM field_reference )
+			{
+			match(input,I_ENCODED_ENUM,FOLLOW_I_ENCODED_ENUM_in_enum_literal3748); 
+			match(input, Token.DOWN, null); 
+			pushFollow(FOLLOW_field_reference_in_enum_literal3750);
+			field_reference223=field_reference();
+			state._fsp--;
+
+			match(input, Token.UP, null); 
+
+
+			      value = field_reference223;
+			    
+			}
+
+		}
+		catch (RecognitionException re) {
+			reportError(re);
+			recover(input,re);
+		}
+		finally {
+			// do for sure before leaving
+		}
+		return value;
+	}
+	// $ANTLR end "enum_literal"
+
+	// Delegated rules
+
+
+
+	public static final BitSet FOLLOW_I_CLASS_DEF_in_smali_file52 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_header_in_smali_file54 = new BitSet(new long[]{0x0000000000000000L,0x0010000000000000L});
+	public static final BitSet FOLLOW_methods_in_smali_file56 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L});
+	public static final BitSet FOLLOW_fields_in_smali_file58 = new BitSet(new long[]{0x0000000000000000L,0x0000000010000000L});
+	public static final BitSet FOLLOW_annotations_in_smali_file60 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_class_spec_in_header85 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L,0x0000020000000004L});
+	public static final BitSet FOLLOW_super_spec_in_header87 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_implements_list_in_header90 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_source_spec_in_header92 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_class_spec110 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+	public static final BitSet FOLLOW_access_list_in_class_spec112 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_I_SUPER_in_super_spec130 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_super_spec132 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_IMPLEMENTS_in_implements_spec152 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_implements_spec154 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_implements_spec_in_implements_list184 = new BitSet(new long[]{0x0000000000000002L,0x0000400000000000L});
+	public static final BitSet FOLLOW_I_SOURCE_in_source_spec213 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_string_literal_in_source_spec215 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_ACCESS_LIST_in_access_list248 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_ACCESS_SPEC_in_access_list266 = new BitSet(new long[]{0x0000000000000018L});
+	public static final BitSet FOLLOW_I_FIELDS_in_fields308 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_field_in_fields317 = new BitSet(new long[]{0x0000000000000008L,0x0000040000000000L});
+	public static final BitSet FOLLOW_I_METHODS_in_methods349 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_method_in_methods358 = new BitSet(new long[]{0x0000000000000008L,0x0008000000000000L});
+	public static final BitSet FOLLOW_I_FIELD_in_field383 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_SIMPLE_NAME_in_field385 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+	public static final BitSet FOLLOW_access_list_in_field387 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
+	public static final BitSet FOLLOW_I_FIELD_TYPE_in_field390 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_field392 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_field_initial_value_in_field395 = new BitSet(new long[]{0x0000000000000008L,0x0000000010000000L});
+	public static final BitSet FOLLOW_annotations_in_field397 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_FIELD_INITIAL_VALUE_in_field_initial_value418 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_literal_in_field_initial_value420 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_integer_literal_in_literal442 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_long_literal_in_literal450 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_short_literal_in_literal458 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_byte_literal_in_literal466 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_float_literal_in_literal474 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_double_literal_in_literal482 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_char_literal_in_literal490 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_string_literal_in_literal498 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_bool_literal_in_literal506 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_NULL_LITERAL_in_literal514 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_type_descriptor_in_literal522 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_array_literal_in_literal530 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_subannotation_in_literal538 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_field_literal_in_literal546 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_method_literal_in_literal554 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_enum_literal_in_literal562 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_fixed_64bit_literal_number578 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_long_literal_in_fixed_64bit_literal_number586 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_short_literal_in_fixed_64bit_literal_number594 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_byte_literal_in_fixed_64bit_literal_number602 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_float_literal_in_fixed_64bit_literal_number610 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_double_literal_in_fixed_64bit_literal_number618 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_char_literal_in_fixed_64bit_literal_number626 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_bool_literal_in_fixed_64bit_literal_number634 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_fixed_64bit_literal649 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_long_literal_in_fixed_64bit_literal657 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_short_literal_in_fixed_64bit_literal665 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_byte_literal_in_fixed_64bit_literal673 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_float_literal_in_fixed_64bit_literal681 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_double_literal_in_fixed_64bit_literal689 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_char_literal_in_fixed_64bit_literal697 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_bool_literal_in_fixed_64bit_literal705 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_fixed_32bit_literal722 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_long_literal_in_fixed_32bit_literal730 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_short_literal_in_fixed_32bit_literal738 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_byte_literal_in_fixed_32bit_literal746 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_float_literal_in_fixed_32bit_literal754 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_char_literal_in_fixed_32bit_literal762 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_bool_literal_in_fixed_32bit_literal770 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_I_ARRAY_ELEMENTS_in_array_elements792 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_fixed_64bit_literal_number_in_array_elements801 = new BitSet(new long[]{0x0000004000404C08L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_I_PACKED_SWITCH_ELEMENTS_in_packed_switch_elements837 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_label_ref_in_packed_switch_elements846 = new BitSet(new long[]{0x0000000000000008L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_I_SPARSE_SWITCH_ELEMENTS_in_sparse_switch_elements881 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_fixed_32bit_literal_in_sparse_switch_elements891 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_sparse_switch_elements893 = new BitSet(new long[]{0x0000004000004C08L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_I_METHOD_in_method945 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_method_name_and_prototype_in_method953 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+	public static final BitSet FOLLOW_access_list_in_method961 = new BitSet(new long[]{0x0000000000000000L,0x4084000000000000L});
+	public static final BitSet FOLLOW_registers_directive_in_method988 = new BitSet(new long[]{0x0000000000000000L,0x0080000000000000L});
+	public static final BitSet FOLLOW_ordered_method_items_in_method1045 = new BitSet(new long[]{0x0000000000000000L,0x0000000400000000L});
+	public static final BitSet FOLLOW_catches_in_method1053 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_parameters_in_method1061 = new BitSet(new long[]{0x0000000000000000L,0x0000000010000000L});
+	public static final BitSet FOLLOW_annotations_in_method1070 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_METHOD_PROTOTYPE_in_method_prototype1094 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_I_METHOD_RETURN_TYPE_in_method_prototype1097 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_type_descriptor_in_method_prototype1099 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_method_type_list_in_method_prototype1102 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_SIMPLE_NAME_in_method_name_and_prototype1120 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L});
+	public static final BitSet FOLLOW_method_prototype_in_method_name_and_prototype1122 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_method_type_list1156 = new BitSet(new long[]{0x0000000000008102L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_reference_type_descriptor_in_method_reference1185 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_SIMPLE_NAME_in_method_reference1188 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L});
+	public static final BitSet FOLLOW_method_prototype_in_method_reference1190 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_reference_type_descriptor_in_field_reference1207 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_SIMPLE_NAME_in_field_reference1210 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_field_reference1212 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_I_REGISTERS_in_registers_directive1238 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_I_LOCALS_in_registers_directive1250 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_short_integral_literal_in_registers_directive1268 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_LABEL_in_label_def1288 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_SIMPLE_NAME_in_label_def1290 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_CATCHES_in_catches1316 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_catch_directive_in_catches1318 = new BitSet(new long[]{0x0000000000000008L,0x0000000300000000L});
+	public static final BitSet FOLLOW_catchall_directive_in_catches1321 = new BitSet(new long[]{0x0000000000000008L,0x0000000200000000L});
+	public static final BitSet FOLLOW_I_CATCH_in_catch_directive1334 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_catch_directive1336 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_catch_directive1340 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_catch_directive1344 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_catch_directive1348 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_CATCHALL_in_catchall_directive1364 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_label_ref_in_catchall_directive1368 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_catchall_directive1372 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_catchall_directive1376 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_PARAMETERS_in_parameters1393 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_parameter_in_parameters1396 = new BitSet(new long[]{0x0000000000000008L,0x0400000000000000L});
+	public static final BitSet FOLLOW_I_PARAMETER_in_parameter1412 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_REGISTER_in_parameter1414 = new BitSet(new long[]{0x0000000000000000L,0x0000000010000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_string_literal_in_parameter1416 = new BitSet(new long[]{0x0000000000000000L,0x0000000010000000L});
+	public static final BitSet FOLLOW_annotations_in_parameter1419 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_line_in_debug_directive1436 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_local_in_debug_directive1442 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_end_local_in_debug_directive1448 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_restart_local_in_debug_directive1454 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_prologue_in_debug_directive1460 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_epilogue_in_debug_directive1466 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_source_in_debug_directive1472 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_I_LINE_in_line1483 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_integral_literal_in_line1485 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_LOCAL_in_local1503 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_REGISTER_in_local1505 = new BitSet(new long[]{0x0000000000000008L,0x0000000000000000L,0x0004000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_NULL_LITERAL_in_local1509 = new BitSet(new long[]{0x0000000000008108L,0x0000000000000000L,0x0200000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_string_literal_in_local1515 = new BitSet(new long[]{0x0000000000008108L,0x0000000000000000L,0x0200000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_local1518 = new BitSet(new long[]{0x0000000000000008L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_string_literal_in_local1523 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_END_LOCAL_in_end_local1544 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_REGISTER_in_end_local1546 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_RESTART_LOCAL_in_restart_local1564 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_REGISTER_in_restart_local1566 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_PROLOGUE_in_prologue1583 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_I_EPILOGUE_in_epilogue1599 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_I_SOURCE_in_source1616 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_string_literal_in_source1618 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_ORDERED_METHOD_ITEMS_in_ordered_method_items1637 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_label_def_in_ordered_method_items1640 = new BitSet(new long[]{0x0000000000000008L,0x2003830000000000L,0x000000FFFFFFFFF6L});
+	public static final BitSet FOLLOW_instruction_in_ordered_method_items1644 = new BitSet(new long[]{0x0000000000000008L,0x2003830000000000L,0x000000FFFFFFFFF6L});
+	public static final BitSet FOLLOW_debug_directive_in_ordered_method_items1648 = new BitSet(new long[]{0x0000000000000008L,0x2003830000000000L,0x000000FFFFFFFFF6L});
+	public static final BitSet FOLLOW_SIMPLE_NAME_in_label_ref1664 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_I_REGISTER_LIST_in_register_list1689 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_REGISTER_in_register_list1698 = new BitSet(new long[]{0x0000000000000008L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_I_REGISTER_RANGE_in_register_range1723 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_REGISTER_in_register_range1728 = new BitSet(new long[]{0x0000000000000008L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_register_range1732 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference1755 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_field_reference_in_verification_error_reference1765 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_method_reference_in_verification_error_reference1775 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_VERIFICATION_ERROR_TYPE_in_verification_error_type1792 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format10t_in_instruction1806 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format10x_in_instruction1812 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format11n_in_instruction1818 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format11x_in_instruction1824 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format12x_in_instruction1830 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format20bc_in_instruction1836 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format20t_in_instruction1842 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21c_field_in_instruction1848 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21c_string_in_instruction1854 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21c_type_in_instruction1860 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21ih_in_instruction1866 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21lh_in_instruction1872 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21s_in_instruction1878 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format21t_in_instruction1884 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22b_in_instruction1890 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22c_field_in_instruction1896 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22c_type_in_instruction1902 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22s_in_instruction1908 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22t_in_instruction1914 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format22x_in_instruction1920 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format23x_in_instruction1926 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format30t_in_instruction1932 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format31c_in_instruction1938 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format31i_in_instruction1944 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format31t_in_instruction1950 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format32x_in_instruction1956 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format35c_method_in_instruction1962 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format35c_type_in_instruction1968 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format3rc_method_in_instruction1974 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format3rc_type_in_instruction1980 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format45cc_method_in_instruction1986 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format4rcc_method_in_instruction1992 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_format51l_type_in_instruction1998 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_array_data_directive_in_instruction2004 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_packed_switch_directive_in_instruction2010 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_insn_sparse_switch_directive_in_instruction2016 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT10t_in_insn_format10t2040 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t2042 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format10t2044 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT10x_in_insn_format10x2067 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x2069 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT11n_in_insn_format11n2092 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n2094 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format11n2096 = new BitSet(new long[]{0x0000000000004800L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_short_integral_literal_in_insn_format11n2098 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT11x_in_insn_format11x2121 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x2123 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format11x2125 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT12x_in_insn_format12x2148 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT12x_in_insn_format12x2150 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format12x2154 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format12x2158 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT20bc_in_insn_format20bc2181 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc2183 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+	public static final BitSet FOLLOW_verification_error_type_in_insn_format20bc2185 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_verification_error_reference_in_insn_format20bc2187 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT20t_in_insn_format20t2210 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t2212 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format20t2214 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT21c_FIELD_in_insn_format21c_field2237 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_set_in_insn_format21c_field2241 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21c_field2249 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_field_reference_in_insn_format21c_field2251 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT21c_STRING_in_insn_format21c_string2274 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string2276 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21c_string2278 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_string_literal_in_insn_format21c_string2280 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT21c_TYPE_in_insn_format21c_type2303 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type2305 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21c_type2307 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_insn_format21c_type2309 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT21ih_in_insn_format21ih2332 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih2334 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21ih2336 = new BitSet(new long[]{0x0000004000004C00L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_fixed_32bit_literal_in_insn_format21ih2338 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT21lh_in_insn_format21lh2361 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh2363 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21lh2365 = new BitSet(new long[]{0x0000004000404C00L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_fixed_64bit_literal_in_insn_format21lh2367 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT21s_in_insn_format21s2390 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s2392 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21s2394 = new BitSet(new long[]{0x0000000000004800L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_short_integral_literal_in_insn_format21s2396 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT21t_in_insn_format21t2419 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t2421 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format21t2423 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format21t2425 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT22b_in_insn_format22b2448 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b2450 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22b2454 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22b2458 = new BitSet(new long[]{0x0000000000004800L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_short_integral_literal_in_insn_format22b2460 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT22c_FIELD_in_insn_format22c_field2483 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_set_in_insn_format22c_field2487 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_field2497 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_field2501 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_field_reference_in_insn_format22c_field2503 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT22c_TYPE_in_insn_format22c_type2526 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type2528 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_type2532 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22c_type2536 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_insn_format22c_type2538 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT22s_in_insn_format22s2561 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22s_in_insn_format22s2563 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22s2567 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22s2571 = new BitSet(new long[]{0x0000000000004800L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_short_integral_literal_in_insn_format22s2573 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT22t_in_insn_format22t2596 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t2598 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22t2602 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22t2606 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format22t2608 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT22x_in_insn_format22x2631 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x2633 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22x2637 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format22x2641 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT23x_in_insn_format23x2664 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x2666 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format23x2670 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format23x2674 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format23x2678 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT30t_in_insn_format30t2701 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t2703 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format30t2705 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT31c_in_insn_format31c2728 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c2730 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format31c2732 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+	public static final BitSet FOLLOW_string_literal_in_insn_format31c2734 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT31i_in_insn_format31i2757 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT31i_in_insn_format31i2759 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format31i2761 = new BitSet(new long[]{0x0000004000004C00L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_fixed_32bit_literal_in_insn_format31i2763 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT31t_in_insn_format31t2786 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t2788 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format31t2790 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_label_ref_in_insn_format31t2792 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT32x_in_insn_format32x2815 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x2817 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format32x2821 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format32x2825 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT35c_METHOD_in_insn_format35c_method2848 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method2850 = new BitSet(new long[]{0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format35c_method2852 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format35c_method2854 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT35c_TYPE_in_insn_format35c_type2877 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type2879 = new BitSet(new long[]{0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format35c_type2881 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_insn_format35c_type2883 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT3rc_METHOD_in_insn_format3rc_method2906 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method2908 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
+	public static final BitSet FOLLOW_register_range_in_insn_format3rc_method2910 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format3rc_method2912 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT3rc_TYPE_in_insn_format3rc_type2935 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type2937 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
+	public static final BitSet FOLLOW_register_range_in_insn_format3rc_type2939 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_insn_format3rc_type2941 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT45cc_METHOD_in_insn_format45cc_method2964 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method2966 = new BitSet(new long[]{0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_register_list_in_insn_format45cc_method2968 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format45cc_method2970 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L});
+	public static final BitSet FOLLOW_method_prototype_in_insn_format45cc_method2972 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT4rcc_METHOD_in_insn_format4rcc_method2995 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method2997 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
+	public static final BitSet FOLLOW_register_range_in_insn_format4rcc_method2999 = new BitSet(new long[]{0x0000000000008100L,0x0000000000000000L,0x8000000000000000L});
+	public static final BitSet FOLLOW_method_reference_in_insn_format4rcc_method3001 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L});
+	public static final BitSet FOLLOW_method_prototype_in_insn_format4rcc_method3003 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_FORMAT51l_in_insn_format51l_type3026 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l_type3028 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+	public static final BitSet FOLLOW_REGISTER_in_insn_format51l_type3030 = new BitSet(new long[]{0x0000004000404C00L,0x0000000001000000L,0x4000400000000000L});
+	public static final BitSet FOLLOW_fixed_64bit_literal_in_insn_format51l_type3032 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_ARRAY_DATA_in_insn_array_data_directive3055 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_I_ARRAY_ELEMENT_SIZE_in_insn_array_data_directive3058 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_short_integral_literal_in_insn_array_data_directive3060 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_array_elements_in_insn_array_data_directive3063 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_PACKED_SWITCH_in_insn_packed_switch_directive3085 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_I_PACKED_SWITCH_START_KEY_in_insn_packed_switch_directive3088 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_fixed_32bit_literal_in_insn_packed_switch_directive3090 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_packed_switch_elements_in_insn_packed_switch_directive3093 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_STATEMENT_SPARSE_SWITCH_in_insn_sparse_switch_directive3117 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_sparse_switch_elements_in_insn_sparse_switch_directive3119 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor3140 = new BitSet(new long[]{0x0000000000008000L,0x0000000000000000L,0x0200000000000000L});
+	public static final BitSet FOLLOW_PRIMITIVE_TYPE_in_array_descriptor3144 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_array_descriptor3172 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor3190 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor3198 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_array_descriptor_in_nonvoid_type_descriptor3206 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor3227 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_array_descriptor_in_reference_type_descriptor3235 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_VOID_TYPE_in_type_descriptor3255 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_nonvoid_type_descriptor_in_type_descriptor3263 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_long_literal_in_short_integral_literal3281 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_short_integral_literal3293 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_short_literal_in_short_integral_literal3305 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_char_literal_in_short_integral_literal3313 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_byte_literal_in_short_integral_literal3321 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_long_literal_in_integral_literal3336 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_integer_literal_in_integral_literal3348 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_short_literal_in_integral_literal3356 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_byte_literal_in_integral_literal3364 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_INTEGER_LITERAL_in_integer_literal3380 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_LONG_LITERAL_in_long_literal3395 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_SHORT_LITERAL_in_short_literal3410 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BYTE_LITERAL_in_byte_literal3425 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_FLOAT_LITERAL_in_float_literal3440 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_DOUBLE_LITERAL_in_double_literal3455 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_CHAR_LITERAL_in_char_literal3470 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_STRING_LITERAL_in_string_literal3485 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_BOOL_LITERAL_in_bool_literal3504 = new BitSet(new long[]{0x0000000000000002L});
+	public static final BitSet FOLLOW_I_ENCODED_ARRAY_in_array_literal3526 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_literal_in_array_literal3529 = new BitSet(new long[]{0x000000400040CD08L,0x000000F001000000L,0x4204410000000000L,0x0000000000000044L});
+	public static final BitSet FOLLOW_I_ANNOTATIONS_in_annotations3554 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_annotation_in_annotations3557 = new BitSet(new long[]{0x0000000000000008L,0x0000000008000000L});
+	public static final BitSet FOLLOW_I_ANNOTATION_in_annotation3586 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_ANNOTATION_VISIBILITY_in_annotation3588 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000010000000000L});
+	public static final BitSet FOLLOW_subannotation_in_annotation3590 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_ANNOTATION_ELEMENT_in_annotation_element3611 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_SIMPLE_NAME_in_annotation_element3613 = new BitSet(new long[]{0x000000400040CD00L,0x000000F001000000L,0x4204410000000000L,0x0000000000000044L});
+	public static final BitSet FOLLOW_literal_in_annotation_element3615 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_SUBANNOTATION_in_subannotation3642 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_CLASS_DESCRIPTOR_in_subannotation3652 = new BitSet(new long[]{0x0000000000000008L,0x0000000020000000L});
+	public static final BitSet FOLLOW_annotation_element_in_subannotation3663 = new BitSet(new long[]{0x0000000000000008L,0x0000000020000000L});
+	public static final BitSet FOLLOW_I_ENCODED_FIELD_in_field_literal3702 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_field_reference_in_field_literal3704 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_ENCODED_METHOD_in_method_literal3725 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_method_reference_in_method_literal3727 = new BitSet(new long[]{0x0000000000000008L});
+	public static final BitSet FOLLOW_I_ENCODED_ENUM_in_enum_literal3748 = new BitSet(new long[]{0x0000000000000004L});
+	public static final BitSet FOLLOW_field_reference_in_enum_literal3750 = new BitSet(new long[]{0x0000000000000008L});
+}
diff --git a/util/Android.bp b/util/Android.bp
new file mode 100644
index 0000000..dc945c2
--- /dev/null
+++ b/util/Android.bp
@@ -0,0 +1,23 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// 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.
+
+java_library_host {
+    name: "smali-util",
+    srcs: ["src/main/java/**/*.java"],
+    libs: [
+        "guava",
+        "jcommander",
+        "jsr305",
+    ],
+}
